Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Salve a tutti, ecco qui il mio curioso (o forse stupido) problema.
In questa procedura l'argomento plist, lista di nodi linkati, dev'essere liberata dalla memoria.
Codice sorgente - presumibilmente C/C++
void l_free(t_list* plist) {
t_node* old_node;
plist->pwalker = plist->phead;
do {
old_node = plist->pwalker;
plist->pwalker = plist->pwalker->next;
free(old_node->content);
free(old_node->next);
free(old_node);
} while(plist->pwalker != plist->ptail);
free(plist->phead); plist->phead = NULL;
free(plist->pwalker); plist->pwalker = NULL;
free(plist->ptail); plist->ptail = NULL;
free(plist); plist = NULL;
plist contiene il puntatore al nodo testa e un altro al nodo coda, ed è dotata di un puntatore a nodo walker che percorre la lista in un unica direzione: ogni nodo della lista punta al successivo.
Venendo al dunque:
Codice sorgente - presumibilmente Plain Text
plist->pwalker != plist->ptail
non interrompe il ciclo quando pwalker punta all'ultimo nodo, cioé quando punta allo stesso nodo di ptail (ho verificato ciò in modo da evitare inutili scivoloni).
Il fatto strano è che appendendo alla lista due volte lo stesso puntatore, il ciclo termina felicemente mentre con due puntatori a celle differenti la storia si ripete.
Avete qualcosa da proporre (oltre a lanciare il computer, o me, fuori dalla finestra?). Utilizzo il compilatore DMC (Digital Mars C/C++ Compilers).
Grazie per la vostra disponibilità.
Giulio
________________________________________________________________
MAIN
Codice sorgente - presumibilmente C/C++
int main()
{
int *a = malloc(sizeof(int*));
int *b = malloc(sizeof(int*));
t_list* l = l_get_new_list();
l_append(l,a); l_append(l,b);
l_free(l);
}
STRUTTURE
Codice sorgente - presumibilmente C++
typedefstruct{
void* content;
void* next;
} t_node;
typedefstruct{
t_node* phead;
t_node* ptail;
t_node* pwalker;
} t_list;
ALLOCAZIONE NODI E LISTA
Codice sorgente - presumibilmente C/C++
t_node* l_get_new_node() {
t_node* tmp = (t_node*)h_malloc(sizeof(t_node));
tmp->content = (void*)h_malloc(sizeof(void*));
tmp->next = (t_node*)h_malloc(sizeof(void*));
return tmp;
}
t_list* l_get_new_list() {
t_list* tmp = (t_list*)h_malloc(sizeof(t_list));
tmp->phead = l_get_new_node();
tmp->pwalker = tmp->phead;
tmp->ptail = tmp->phead;
return tmp;
}
la funzione h(andled)_malloc gestisce automaticamente la possibilità di errore. Posto anche quella insieme a 'void fatal' per l'output dell'errore:
Codice sorgente - presumibilmente C#
void fatal(char* msg){
char emsg[128];
printf(emsg,"[!DEBUG!] error in %s:",msg);
perror(emsg);
exit(-1);
}
void* h_malloc(unsigned int size){
void*ptr;
if((ptr =(void*)malloc(size))==NULL) fatal("h_malloc() on memory allocation");
return ptr;
}
Ultima modifica effettuata da giulioscatto il 30/06/2011 alle 21:25
()
Newbie
Messaggi: Iscritto:
0
Postato alle 10:14
Giovedì, 30/06/2011
Puoi inviare le strutture e il main?
Sarà che sono mezzo addormentato ma non riesco a trovare il pulsante per rispondere!! Oppure lo devo scrivere qui? - giulioscatto - 30/06/11 12:10
Sarò proprio addormentato allora http://imageshack.us/photo/my-images/706/immaginesr.png/ - giulioscatto - 30/06/11 12:41
Comunque, come volevasi dimostrare, utilizzando DevC++ invece del DMC tutto va alla grande, facendo una piccola modifica (eliminare la 8a riga dal primo blocco di codice postato). Grazie mille, in futuro vedrò di stare più attento! - giulioscatto - 30/06/11 13:28
nelle domande che apri non puoi rispondere, puoi solo commentare, viceversa puoi rispondere nelle discussioni che apri... - anthony015 - 30/06/11 16:37
Ah ecco! Grazie mille Anthony! - giulioscatto - 30/06/11 18:52
Posta anche l_get_new_list() e l_append()... - pierotofy - 30/06/11 19:41