Alguém pode ver qual o problema com esse código?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#define MAX 21
typedef struct Sapato{
char marca[MAX];
char modelo[MAX];
char cor[MAX];
int num;
struct Sapato *prox;
}TSapato;
//VARIÁVEIS GLOBAIS
char marca[MAX], modelo[MAX], cor[MAX];
int num;
//FUNÇÃO AUXILIAR LER DADOS PILHA
void ler_dados()
{
system ("cls"
printf ("\n\nEntre com a marca do sapato: "
fflush (stdin);
fgets (marca,MAX,stdin);
printf ("Entre com o modelo do sapato: "
fflush (stdin);
fgets (modelo,MAX,stdin);
printf ("Entre com a cor do sapato: "
fflush (stdin);
fgets (cor,MAX,stdin);
printf ("Entre com a numeracao do sapato: "
fflush (stdin);
scanf ("%d", &num);
}
//FUNÇÃO INSERIR DADOS
void pilha_push(TSapato **topo)
{
TSapato *ptr;
ler_dados();//chamando a função
ptr=(TSapato*)malloc(sizeof(TSapato));
strcpy(ptr->marca,marca);
strcpy(ptr->modelo,modelo);
strcpy(ptr->cor,cor);
ptr->num=num;
ptr->prox=NULL;
if(*topo==NULL)
*topo=ptr;
else{
ptr->prox=*topo;
*topo=ptr;
}
}
//FUNÇÃO EXCLUIR DADOS
/*void pilha_pop(TSapato **topo)
{
TSapato *aux;
if(*topo==NULL)
printf ("ERRO: Pilha Vazia.\n"
else{
aux=*topo;
*topo=*topo->prox;
free(aux);
}
}*/
//FUNÇÃO LISTAR DADOS
void pilha_listar(TSapato **topo)
{
TSapato *aux;
aux=*topo;
while(aux!=NULL){
printf ("Marca do Sapato: %s",aux->marca);
printf ("Modelo do Sapato: %s",aux->modelo);
printf ("Cor do Sapato: %s",aux->cor);
printf ("Numero do Sapato: %d",aux->num);
aux=aux->*topo; //ERRO: `topo' cannot be used as a member pointer, since it is of type `TSapato**'
}
}
//FUNÇÃO PRINCIPAL
int main()
{
char op;
TSapato *topo=NULL;
do{
system ("cls"
printf ("\t\t\tFABRICA DE SAPATOS\n\n"
printf ("(I)ncluir dados sapato.\n"
printf ("(E)xcluir dados sapato.\n"
printf ("(L)istar dados sapato.\n"
printf ("(S)air do programa.\n"
printf ("\nDigite a opcao: "
op=toupper(getche());
switch(op){
case 'I': pilha_push(&topo);
break;
/* case 'E': pilha_pop (&topo);
break;*/
case 'L': pilha_listar(&topo);
break;
case 'S': exit(0);
default: printf ("\n\nOpcao invalida, digite novamente.\n\n"
}
system ("PAUSE"
}while (op!='S');
return (0);
}
- Home
- >
- Fórum
- >
- Profissional
- >
- Programação, Sc...
- >
- PIlhas em C
aux=aux->*topo; //ERRO: `topo' cannot be used as a member pointer, since it is of type `TSapato**'
palominha, vou colocar essa na conta da desatenção... :lol:
Veja só: você tem a sua struct Sapato, que tem os campos "marca", "modelo", "cor", "num" e "prox". Tem algum campo "*topo" nessa struct??? Como você quer usar um campo com esse nome, então???
Você está fazendo uma instrução "aux = (alguma coisa)"; se "aux" é do tipo *TSapato, então essa "alguma coisa" tem que ser desse mesmo tipo, certo? Então vamos ver o que você está tentando fazer: pegar um campo do nó apontado por "aux". E desses campos, qual é do tipo *TSapato???
Mas eu passei topo como parâmetro.
TSapato **topo
Os dois são do tipo sapato
Mas não é campo da estrutura... quais são os campos dessa estrutura?
struct Sapato{
char marca[MAX];
char modelo[MAX];
char cor[MAX];
int num;
struct Sapato *prox;
};
typedef struct Sapato TSapato;
Taí: são "marca", "modelo", "cor", "num" e "prox". Então quando você usar "variavel->xxxxx", esse xxxxx tem que ser um desses campos... o operador "->" serve pra isso, pra você indicar que quer pegar um campo de uma estrutura.
Entendi, obrigada
Então olha só: digamos que você tem duas variáveis declaradas assim:
TSapato *ponteiro1, *ponteiro2;
E que lá pelas tantas, eu tenho no meio do meu código uma linha assim:
ponteiro1 = ponteiro2->xxxxxxx;
Ou seja, eu quero que "ponteiro1", que é do tipo (TSapato *), receba o valor de um dos campos da estrutura para onde "ponteiro2" está apontando.
Eu pergunto, qual desses campos é compatível com essa atribuição, ou seja, qual dos campos dentro da struct Sapato tem o mesmo tipo que o que eu quero, que é (TSapato *)?
Eu pergunto, ponteiro 1 e 2 não são do TSapato?
Vamos tentar de outra forma?
Veja esta figura, ela representa a sua pilha.
Veja que há uma variável "topo" que aponta pro primeiro nó, e cada nó tem um campo "prox" que aponta pro próximo. Só o último é diferente, pois aponta para NULL.
Como eu faço para ver o que tem nessa pilha? Eu faço um "percurso" nela:
Agora vamos inserir um novo nó na pilha:
Acho que deu uma clareada, agora, né? Você precisa entender bem alguns conceitos pra gente poder avançar as explicações.