bcouto Posted July 11, 2012 Report Share Posted July 11, 2012 (edited) Boa Tarde, na realização do meu projecto eis que me deparo com outro erro, neste caso quando elimino um nó carregado de um ficheiro de texto, o programa deixa de responder e quando tento abrir o ficheiro este tem a sua informação toda em branco. A função pede um código ao utilizador, valida e se existir na lista ligada, esse nó deverá ser eliminado. Eis o código ao qual não sei se a abordagem será a mais correcta. no_emprestimo *EntregaEmprestimos(no_emprestimo *plista) { no_emprestimo *aux=plista, *ant=NULL; char codigo[18],now[80]; int i; struct tm *n; _int64 rawtime; time (&rawtime); n= localtime ( &rawtime ); strftime(now,80,"%d-%m-%Y",n); printf("\nData Actual:%s",now); do{ puts("\nISBN:***-*-**-******-* : "); fflush(stdin); gets(codigo); }while(codigo[3]!='-'||codigo[5]!='-'||codigo[8]!='-'||codigo[15]!='-'); while(aux && (strcmp(aux->emp.isbn,codigo))) { ant=aux; aux=aux->next; } if(aux == NULL) printf("Ocorreu um erro de validação"); else { if(ant == NULL) plista=aux->next; else ant->next=aux->next; free(aux); printf("O Documento com o ISBN %s foi eliminado da Lista de Empréstimos\n", codigo); } system("pause"); return plista; } Em seguida quando clico na função de mostragem da lista ligada, o projecto deixa de funcionar e o ficheiro.txt fica vazio e não apaga apenas aquele a que se referia a função. Se pudessem dar uma vista de olhos agradecia 😉 void MostraEmprestimo (no_emprestimo *plistaemp) { printf("\n"); printf("Nome: %s",plistaemp->emp.nome); printf("\nIsbn: %s",plistaemp->emp.isbn); printf("\nData de Requisição: %s",plistaemp->emp.datareq); printf("\nData de Entrega: %s",plistaemp->emp.dataent); printf("\nPrazo: %d\n",plistaemp->emp.prazo); printf("\n"); } void ApresentaEmprestimo(no_emprestimo *plistaemp) { if(plistaemp) while(plistaemp) { MostraEmprestimo(plistaemp); if(plistaemp!=NULL) plistaemp=plistaemp->next; } else printf("\n**** LISTA VAZIA ****\n"); } Edited July 11, 2012 by bcouto Link to comment Share on other sites More sharing options...
pmg Posted July 11, 2012 Report Share Posted July 11, 2012 Como e que chamas a funcao EntregaEmprestimos()? What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
bcouto Posted July 11, 2012 Author Report Share Posted July 11, 2012 Como e que chamas a funcao EntregaEmprestimos()? no_emprestimo *inicio=NULL; EntregaEmprestimos(inicio); break; Está num menu, mas é chamada assim no Case. Link to comment Share on other sites More sharing options...
pmg Posted July 11, 2012 Report Share Posted July 11, 2012 Tal como eu pensava. No teu caso a variavel inicio nao 'e alterada pela chamada `a funcao. Para alterares a variavel ou alteras a funcao para aceitar um ponteiro para o ponteiro (senao a alteracao 'e feita apenas `a variavel local) ou, como ja puseste um 'return' na tua funcao, aproveita esse valor: inicio = EntregaEmprestimos(inicio) Para completar a ideia, a alteracao da funcao passaria pelo prototipo no_emprestimo *EntregaEmprestimos(no_emprestimo **plista); e chamando a funcao com o endereco do ponteiro no_emprestimo *inicio=NULL; EntregaEmprestimos(&inicio); What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
bcouto Posted July 12, 2012 Author Report Share Posted July 12, 2012 Tal como eu pensava. No teu caso a variavel inicio nao 'e alterada pela chamada `a funcao. Para alterares a variavel ou alteras a funcao para aceitar um ponteiro para o ponteiro (senao a alteracao 'e feita apenas `a variavel local) ou, como ja puseste um 'return' na tua funcao, aproveita esse valor: inicio = EntregaEmprestimos(inicio) Para completar a ideia, a alteracao da funcao passaria pelo prototipo no_emprestimo *EntregaEmprestimos(no_emprestimo **plista); e chamando a funcao com o endereco do ponteiro no_emprestimo *inicio=NULL; EntregaEmprestimos(&inicio); Resultou, problema resolvido 😉 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now