tester Postado Abril 6, 2010 Denunciar Share Postado Abril 6, 2010 peguei um tuto na net e me basei pra fazer um exercicio da facu mas to com dificuldadena hora de listar ele não mostra nada !o que sera ?#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Pilha { char nome[20]; struct Pilha *embaixo; }pilha, tElemento; void empilhar(pilha *tElemento) { int numero; printf("\nQuantos nomes?: "); scanf("%d",&numero); for(numero;numero>0;numero--) { tElemento = ((pilha*)malloc(sizeof(pilha))); printf("Nome: "); scanf("%s", tElemento -> nome); } } void desempilhar(pilha *tElemento) { pilha *ponteiro; int numero; printf("desempilhar: "); scanf("%d",&numero); for(numero;numero>0;numero--) { if(tElemento == NULL) { ponteiro = tElemento; tElemento = tElemento -> embaixo; free(ponteiro); } } } void listar(pilha *tElemento) { if(tElemento != NULL){ if(tElemento){ printf("\nNome: %s\n",tElemento -> nome); getch(); } }else tElemento = tElemento -> embaixo; } void inicializa(pilha **tElemento){ *tElemento = NULL; } int main() { pilha *tElemento; int loop; loop = 1; int menu; inicializa(&tElemento); while(loop==1){ printf("\n----MENU----\n"); printf("1- EMPILHAR: "); printf("\n2- DESEMPILHAR: "); printf("\n3- LISTAR: "); printf("\n4- SAIR: \n"); printf("\nOPCAO: "); scanf("%d",&menu); switch(menu){ case 1: empilhar(tElemento); break; case 2: desempilhar(tElemento); break; case 3: listar(&tElemento); break; case 4: exit(1); break; default: printf("\nopcao inexistente\n \a"); } } }abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 RonaldoRG Postado Abril 6, 2010 Denunciar Share Postado Abril 6, 2010 Vou ver se eu consigo te explicar onde tá o erro. Ele tá aqui nessa função:void empilhar(pilha *tElemento) { ... tElemento = ((pilha*)malloc(sizeof(pilha))); ... int main() { pilha *tElemento; ... empilhar(tElemento); ...Você criou um ponteiro em main e passou ele pra empilhar. Lá a variável tElemento recebe uma alocação de memória criada pelo malloc. Mas só que essa alocação não é passada para tElemento de main. Quando a função empilhar acaba a variavel tElemento morre e leva junto a alocação feita lá.Você tem que alocar primeiro na função main passar tElemento para a função empilhar, e lá fazer as modificações do conteúdo de tElemento. Ai sim elas vão refletir em main. Espero que tenha entendido. qualquer dúvida posta ai. Abraço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 tester Postado Abril 7, 2010 Autor Denunciar Share Postado Abril 7, 2010 hum... vendo oque voce explicou deu pra entender um pouco...mas na prática acho que preciso de um empurrão =/ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jonathan Queiroz Postado Abril 7, 2010 Denunciar Share Postado Abril 7, 2010 Uma solução é passar o endereço do ponteiro para a função empilhar e de lá modificar o lugar para o qual o ponteiro aponta (usando ponteiros de ponteiros, meio complexo). Outra solução mais simples (e mais recomendável nesse caso) é fazer com que a função empilhar retorne o endereço que foi alocado.A função main pode ficar mais ou menos assim:pilhar*tElemento; inicializar(tElemento); ... tElemento=empilhar(); E a função empilhar, assim: pilha* empilhar(){ ... tElemento = ((pilha*)malloc(sizeof(pilha))); ... //No fim da função retornamos o novo elemento return tElemento; }Poste aí se funcionou ou não. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 tester Postado Abril 7, 2010 Autor Denunciar Share Postado Abril 7, 2010 (editado) vlw...tentei e está dando um erro na função:pilha* empilhar(){ ... tElemento = ((pilha*)malloc(sizeof(pilha))); <<< ... } Editado Abril 7, 2010 por Jonathan Queiroz Adicionar tag's (Jonathan) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 RonaldoRG Postado Abril 7, 2010 Denunciar Share Postado Abril 7, 2010 (editado) Você declarou na função empilhar a variável *tElemento"?Como o código tá abreviado não deu pra ver. É bom você sempre postar a saída do compilador em caso de erro, ai facilita agente identificar o erro.Abraço. Editado Abril 7, 2010 por RonaldoRG Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 tester Postado Abril 7, 2010 Autor Denunciar Share Postado Abril 7, 2010 (editado) opa vlw jonathan e ronaldomalz por inxer o saco de vocês '-'ainda ta dando um erro ronaldonossa agora misturei , tinha olhado o outro exemplo. vo ve se ajeito o código aqui.editando o tópico...abraçosto usando o código com base no exemplo de jonathan ok#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Pilha { char nome[20]; struct Pilha *embaixo; }pilha, tElemento; pilha* empilhar() { int numero; pilha *tElemento; printf("\nQuantos nomes?: "); scanf("%d",&numero); for(numero;numero>0;numero--) { tElemento = ((pilha*)malloc(sizeof(pilha))); printf("Nome: "); scanf("%s", tElemento -> nome); return tElemento; } } void desempilhar(pilha *tElemento) { pilha *ponteiro; int numero; printf("desempilhar: "); scanf("%d",&numero); for(numero;numero>0;numero--) { if(tElemento == NULL) { ponteiro = tElemento; tElemento = tElemento -> embaixo; free(ponteiro); } } } void listar(pilha *tElemento) { if(tElemento != NULL){ if(tElemento){ printf("\nNome: %s\n",tElemento -> nome); getch(); } }else tElemento = tElemento -> embaixo; } void inicializa(pilha **tElemento){ *tElemento = NULL; } int main() { pilha*tElemento; inicializa(tElemento); int loop; loop = 1; int menu; tElemento = empilhar(); while(loop==1){ printf("\n----MENU----\n"); printf("1- EMPILHAR: "); printf("\n2- DESEMPILHAR: "); printf("\n3- LISTAR: "); printf("\n4- SAIR: \n"); printf("\nOPCAO: "); scanf("%d",&menu); switch(menu){ case 1: empilhar(tElemento); break; case 2: desempilhar(tElemento); break; case 3: listar(&tElemento); break; case 4: exit(1); break; default: printf("\nopcao inexistenlwte\n \a"); } } }esse assunto de ponteiros pra mim é um saco '-' vo te que aprender isso meu heuhueaha Editado Abril 7, 2010 por Durub Adicionar tags code [Durub] Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jonathan Queiroz Postado Abril 7, 2010 Denunciar Share Postado Abril 7, 2010 opa vlw jonathan e ronaldomalz por inxer o saco de vocês '-'Encher o saco não, fórum é pra isso mesmo: ajudar e ser ajudado.Mas qual o erro que está ocorrendo? Erro de compilação ou o programa compila e não roda como o esperado?Se o programa não está rodando como esperado quando se escreve mais de um nome, tente modificar o programa para alocar memória suficiente para todos os nomes de uma só vez (dessa forma, as variáveis serão alocadas de forma linear) e retornar o ponteiro só no final do programa.O código pode ficar mais ou menos assim:int numero; pilha *tElemento; printf("\nQuantos nomes?: "); scanf("%d",&numero); tElemento=((pilha*)malloc(sizeof pilha*numero)); //se desejar, também pode utilizar a função calloc for(numero;numero>0;numero--) { printf("Nome: "); scanf("%s", tElemento[numero] -> nome); } return tElemento; //retorna o elemento Nota: tElement[indice] = *(tElemento + indice)Ponteiros podem ser escrito na forma de arrays e vice-versa. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 RonaldoRG Postado Abril 7, 2010 Denunciar Share Postado Abril 7, 2010 opa vlw jonathan e ronaldomalz por inxer o saco de vocês '-'Encher o saco não, fórum é pra isso mesmo: ajudar e ser ajudado.É isso mesmo estamos aqui pra aprender, fique a vontade.É sempre bom postar a saída do compilador no caso de erro. Vê se a dica do Jonathan dá certo ai e posta o resultado.Abraço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
tester
peguei um tuto na net e me basei pra fazer um exercicio da facu mas to com dificuldade
na hora de listar ele não mostra nada !
o que sera ?
abraços
Link para o comentário
Compartilhar em outros sites
8 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.