|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2003
Città: Rimini
Messaggi: 2279
|
code in C
Sto facendo un programma in C che fa uso delle code. Questo è la definizione degli oggetti della coda:
typedef struct lista { int ind; int tipo; struct lista *next; } Quando devo estrarre un oggetto dalla testa della coda, lo "copio" in una struttura temporanea, poi sposto il puntatore alla testa e lo cancello. Così: k.ind = testa->ind; k.tipo = testa->tipo; corrente = testa; testa = testa->next; free(corrente); Quando faccio questa operazione il MS Visual C++ mi dà un errore strano a runtime, che ho allegato. Se clicco Retry e poi debug (nella finestra classica d'errore di windows, dà un errore nel file vc98\crt\src\dbgheap.c. Il messaggio esatto è "User breakpoint called from code at 0x403adf". Sono certo che è il free() che dà l'errore, perché se lo tolgo fila tutto liscio. Cosa può essere? Help!
__________________
Gigabyte 965P-DS3 ¤ E6600@400*8 ¤ Scythe Ninja Plus Rev.B ¤ Ram 4GB ¤ HD SSD Crucial M4 128GB
Gainward 4850 Golden Sample ¤ Antec NEO 550HE ¤ CM Centurion 534 ¤ Dell Ultrasharp U2312HM Notebook Asus N551JW ¤ i7-4750HQ ¤ nVidia 960M 4GB ¤ 16GB DDR3 ¤ SSD Intel 850EVO 500GB |
|
|
|
|
|
#2 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Re: code in C
Quote:
Pertanto se 'corrente' è una variabile struttura creata con una definizione di variabile, non puoi usare la free(). Questo potrebbe spiegare il fantomatico errore "DAMAGE" che ti restituisce Visual C++. Difatti molto probabilmente la free() in quel punto starà deallocando chissà cosa ... Ultima modifica di mjordan : 20-09-2003 alle 23:09. |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
|
w il garbage collector
probabilmente stai cercando di liberare un indirizzo di memoria che non è nello heap, avrai fatto qualche casino con i puntatori e con le variabili. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2003
Città: Rimini
Messaggi: 2279
|
corrente è un puntatore a struttura; non ho usato la malloc con "corrente", ma con "nuovo" che è sempre un puntatore a struttura che uso quando devo inserire gli elementi della coda. Pensavo che facendo puntare a corrente una struttura precedentemente allocata, potessi liberarla semplicemente con free().
Come posso fare allora per deallocare la memoria degli elementi estratti? Non vorrei lasciarla occupata, e siccome il garbage collector non ce l'ho
__________________
Gigabyte 965P-DS3 ¤ E6600@400*8 ¤ Scythe Ninja Plus Rev.B ¤ Ram 4GB ¤ HD SSD Crucial M4 128GB
Gainward 4850 Golden Sample ¤ Antec NEO 550HE ¤ CM Centurion 534 ¤ Dell Ultrasharp U2312HM Notebook Asus N551JW ¤ i7-4750HQ ¤ nVidia 960M 4GB ¤ 16GB DDR3 ¤ SSD Intel 850EVO 500GB |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Io pensavo che ti avessero costretto con la pistola a farti la coda in C
Usa la STL che ti da la coda bella e che fatta(e più efficiente di quanto tu mai possa fare ...senza offesa) Oh ma la STL non la usa mai nessuno? (eppure ti allunga la vita...) |
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
|
|
|
|
|
|
|
#7 | ||
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Quote:
|
||
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Quote:
Sai quante volte qualcuno si incarta perchè non sa dell'esistenza dei containers STL? Se è per imparare gli algoritmi ...va bene.Altrimenti... "Thinking in C++" |
|
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
E chi si innervosisce
Volevo solo dire che siamo in un contesto C e la programmazione di una struttura di dati non è un motivo per cambiare linguaggio |
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
|
Re: Re: code in C
Quote:
poichè se non lo fosse allora il compilatore darebbe errore A PRESCINDERE dal free, difatti compare un'assegnazione (corrente = testa) dove testa è sicuramente un lista* (puntatore)... con queste poche info cmq l'unico consiglio che mi viene in mente è di mettere due printf prima dell'invocazione del free, così da leggere i valori di corrente e valutarne la consistenza (quindi un debug ciao! |
|
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Re: Re: Re: code in C
Quote:
|
|
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
|
k.ind = testa->ind;
k.tipo = testa->tipo; corrente = testa; testa è un puntatore, non può essere uno struct sennò l'operatore "->" darebbe errore a prescindere dal free cmq, al creatore del thread, hai fatto un debug? hai ulteriori info al riguardo? |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2003
Città: Rimini
Messaggi: 2279
|
Innanzitutto grazie a tutti per l'aiuto.
Il debug l'ho fatto, ma non ha risolto niente. Mi spiego: il programma funziona perfettamente, non ci sono inconsistenze in quanto tutti gli elementi della lista vengono letti correttamente, e next punta effettivamente al successivo elemento della lista. Facendo il debug, arrivato al famigerato "free(corrente)" (che per fugare eventuali dubbi è un puntatore e non una struttura) dà lo stesso errore che dà a runtime. Se lo tolgo, funziona tutto perfettamente (tranne per il fatto che quella piccola parte di memoria rimane allocata fino al termine del programma). Aggiungo un altro dettaglio che magari potrebbe aiutarci (o incasinare ancora di più le cose!): quel problema con free lo fa solo all'interno delle funzioni, se faccio dei free (sugli stessi tipi di strutture) nel main(), non c'è nessun errore.
__________________
Gigabyte 965P-DS3 ¤ E6600@400*8 ¤ Scythe Ninja Plus Rev.B ¤ Ram 4GB ¤ HD SSD Crucial M4 128GB
Gainward 4850 Golden Sample ¤ Antec NEO 550HE ¤ CM Centurion 534 ¤ Dell Ultrasharp U2312HM Notebook Asus N551JW ¤ i7-4750HQ ¤ nVidia 960M 4GB ¤ 16GB DDR3 ¤ SSD Intel 850EVO 500GB |
|
|
|
|
|
#14 |
|
Bannato
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
|
ok allora prova a passare i riferimenti alle strutture e non i puntatori,come parametri delle funzioni!
il vc++ gestisce talvolta male,te lo dico per esperienza, lo sharing di bytes tra puntatori, facendo come ti dico io gli passi direttamente l'indirizzo e quindi non hai sharing... famme sape |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2003
Città: Rimini
Messaggi: 2279
|
Quote:
__________________
Gigabyte 965P-DS3 ¤ E6600@400*8 ¤ Scythe Ninja Plus Rev.B ¤ Ram 4GB ¤ HD SSD Crucial M4 128GB
Gainward 4850 Golden Sample ¤ Antec NEO 550HE ¤ CM Centurion 534 ¤ Dell Ultrasharp U2312HM Notebook Asus N551JW ¤ i7-4750HQ ¤ nVidia 960M 4GB ¤ 16GB DDR3 ¤ SSD Intel 850EVO 500GB |
|
|
|
|
|
|
#16 |
|
Bannato
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
|
scusa posta il codice gli dò un'occhiata
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: May 2003
Città: Rimini
Messaggi: 2279
|
Eccolo; guarda nella funzione CamminoAumentante alla riga 55 e in quella Ricostruisci alla riga 188, ci sono i free incriminati. Nella prima funzione ho usato una coda, nella seconda una pila.
(bisogna togliere il .zip, visto che vBulletin rompe con le estensioni
__________________
Gigabyte 965P-DS3 ¤ E6600@400*8 ¤ Scythe Ninja Plus Rev.B ¤ Ram 4GB ¤ HD SSD Crucial M4 128GB
Gainward 4850 Golden Sample ¤ Antec NEO 550HE ¤ CM Centurion 534 ¤ Dell Ultrasharp U2312HM Notebook Asus N551JW ¤ i7-4750HQ ¤ nVidia 960M 4GB ¤ 16GB DDR3 ¤ SSD Intel 850EVO 500GB |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
|
caro bizzu,mi spiace ma il codi che m'hai mandato è formalmente corretto, ossia a rigor di logica dovrebbe funzionare...MA....
non è cosi.. il problema è la struttura dell'algoritmo, l'uso dei puntatori è una delle cose più delicate in c e tu non li usi,ne abUsi infatti non puoi fare un free di una struttura PER OGNI ciclo do while, il free lo devi maneggiare con cura e fare in modo che,qualora ti servono record d'appoggio per scrivere i dati (nel tuo caso la var "corrente") questa NON deve essere deallocata e riallocata continuamente...il motivo è questo: supponi che a testa inizialmente sia dato il valore 0x00320ff (ho fatto un profondo debug riga 56 o 57)... e, dentro al ciclo fai una malloc a "nuovo" che assume il valore appena freeato (tipico comportamento)...ma questo indirizzo E' STATO GIA' DEALLOCATO DAL compilatore quindi, al ciclo successivo, nel RIFARE IL FREE SU CORRENTE (che ha sempre il valore di testa) L'ERRORE...stai deallocando un indirizzo GIA' DEALLOCATO! so che è lunga come spiegazione ma puoi credermi, l'errore di per sè sta nell'algoritmo che,perdonami, è un pò troppo "javistico" PROVARE (il debug, ma serio stavolta) PER CREDERE! ciao |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: May 2003
Città: Rimini
Messaggi: 2279
|
Grazie mille LukeHack... neanche il professore avrebbe debuggato il programma così a fondo!
Ho capito l'errore che ho fatto, adesso mi scervello un po' per rimettere a posto quelle listacce. L'algoritmo è effettivamente "fantasioso" (ho fatto una bella fatica a ricavarlo da quello spiegato "a parole"), cmq è abbastanza efficiente e ha dei buoni tempi di esecuzione su matrici grandi. Cmq non pensavo che i puntatori fossero così suscettibili Io li liberavo con free e pensavo che puntando NULL tornassero come nuovi! Grazie ancora ciao
__________________
Gigabyte 965P-DS3 ¤ E6600@400*8 ¤ Scythe Ninja Plus Rev.B ¤ Ram 4GB ¤ HD SSD Crucial M4 128GB
Gainward 4850 Golden Sample ¤ Antec NEO 550HE ¤ CM Centurion 534 ¤ Dell Ultrasharp U2312HM Notebook Asus N551JW ¤ i7-4750HQ ¤ nVidia 960M 4GB ¤ 16GB DDR3 ¤ SSD Intel 850EVO 500GB |
|
|
|
|
|
#20 |
|
Bannato
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
|
ma figurati
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:18.



















