Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-09-2003, 21:12   #1
bizzu
Senior Member
 
L'Avatar di bizzu
 
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!
Immagini allegate
File Type: jpg errore.jpg (12.6 KB, 22 visite)
__________________
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
bizzu è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2003, 21:49   #2
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Re: code in C

Quote:
Originariamente inviato da bizzu
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!
Dovresti essere un pochino + preciso. Per esempio corrente in quel punto è una struttura o un puntatore a struttura? La cosa è diversa. Infatti free() può essere utilizzata solo per deallocare memoria allocata con funzioni della famiglia malloc(), non per distruggere variabili. E una struttura è considerata una variabile.
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.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2003, 11:36   #3
recoil
Senior Member
 
L'Avatar di recoil
 
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.
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2003, 16:38   #4
bizzu
Senior Member
 
L'Avatar di bizzu
 
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
bizzu è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2003, 17:20   #5
verloc
Senior Member
 
L'Avatar di verloc
 
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...)
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2003, 17:52   #6
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da verloc
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...)
Ingegnere, stiamo usando il C, non il C++
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2003, 17:57   #7
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da bizzu
Pensavo che facendo puntare a corrente una struttura precedentemente allocata, potessi liberarla semplicemente con free().
Pensi bene. free() prende un indirizzo di memoria dal quale comincia a deallocare memoria. Quello che ti dicevo io è semplicemente che la memoria dev'essere stata allocata con malloc(), non importa poi se il puntatore che passi è quello "originale" o una copia. Il valore è uguale in entrambi i casi.

Quote:
Come posso fare allora per deallocare la memoria degli elementi estratti? Non vorrei lasciarla occupata, e siccome il garbage collector non ce l'ho ...
Evidentemente non ci sono sufficienti informazioni per poter stabilire un eventuale errore.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2003, 08:47   #8
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
Quote:
Originariamente inviato da mjordan
Ingegnere, stiamo usando il C, non il C++
Eddai...non ti innervosire.

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++"
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2003, 22:51   #9
mjordan
Bannato
 
L'Avatar di mjordan
 
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
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2003, 05:06   #10
LukeHack
Bannato
 
L'Avatar di LukeHack
 
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
Re: Re: code in C

Quote:
Originariamente inviato da mjordan
Dovresti essere un pochino + preciso. Per esempio corrente in quel punto è una struttura o un puntatore a struttura? La cosa è diversa. Infatti free() può essere utilizzata solo per deallocare memoria allocata con funzioni della famiglia malloc(), non per distruggere variabili. E una struttura è considerata una variabile.
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 ...
è sicuramente un puntatore a lista (lista* corrente )
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!
LukeHack è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2003, 06:53   #11
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Re: Re: Re: code in C

Quote:
Originariamente inviato da LukeHack
è sicuramente un puntatore a lista (lista* corrente )
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!
Chè c'entra scusa. Quell'assegnazione la puoi interpretare diversamente a seconda del contesto (contesto che non è chiaro). Se sono puntatori l'assegnamento riguarda indirizzi, se sono strutture l'assegnamento riguarda i campi della struttura. Pertanto non ci sarebbe quell'errore che stai citando tu.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2003, 14:35   #12
LukeHack
Bannato
 
L'Avatar di LukeHack
 
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 ergo, corrente è un puntatore

cmq, al creatore del thread, hai fatto un debug? hai ulteriori info al riguardo?
LukeHack è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2003, 14:39   #13
bizzu
Senior Member
 
L'Avatar di bizzu
 
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
bizzu è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2003, 14:45   #14
LukeHack
Bannato
 
L'Avatar di LukeHack
 
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
LukeHack è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2003, 16:43   #15
bizzu
Senior Member
 
L'Avatar di bizzu
 
Iscritto dal: May 2003
Città: Rimini
Messaggi: 2279
Quote:
Originariamente inviato da LukeHack
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
I puntatori usati nella funzione non sono passati come parametro, ma dichiarati nel corpo della funzione, perché vengono usati solo al suo interno e poi non servono +.
__________________
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
bizzu è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2003, 20:52   #16
LukeHack
Bannato
 
L'Avatar di LukeHack
 
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
scusa posta il codice gli dò un'occhiata
LukeHack è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2003, 00:14   #17
bizzu
Senior Member
 
L'Avatar di bizzu
 
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 )
Allegati
File Type: zip trasporti.c.zip (16.6 KB, 5 visite)
__________________
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
bizzu è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2003, 01:39   #18
LukeHack
Bannato
 
L'Avatar di LukeHack
 
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 ), ciò che succede dopo è che corrente viene freeato,dopo che gli è stato assegnato il valore di testa (qui cìè pure un brutto errore,deallochi e poi usi gli indirizzi..)
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"
e fantasioso

PROVARE (il debug, ma serio stavolta) PER CREDERE!
ciao
LukeHack è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2003, 22:46   #19
bizzu
Senior Member
 
L'Avatar di bizzu
 
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! eheh
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
bizzu è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2003, 02:00   #20
LukeHack
Bannato
 
L'Avatar di LukeHack
 
Iscritto dal: May 2003
Città: Roma
Messaggi: 3642
ma figurati fammi sapere come risolvi
LukeHack è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Risparmiare con le offerte Amazon: weeke...
Gli Xiaomi 17 arrivano a fine febbraio, ...
48.000 Pa a poco più di 100€: la ...
PC più potente, meno spesa: su Amazon to...
Con 2 acquisti si ottiene il 40% di scon...
Blocco VPN in Spagna durante le partite ...
ECOVACS DEEBOT T30C OMNI GEN2 torna a 34...
Cercate uno smartphone? Ecco 7 modelli i...
Paramount non molla: Netflix è pr...
Missione Artemis II diretta verso la Lun...
Toy Story 5 arriva al cinema: è l...
Intel cambia rotta su Linux? Nuove assun...
Samsung aggiorna Bixby con One UI 8.5: p...
L'Etiopia vieta le auto a combustione: a...
Pirateria audiovisiva: la Guardia di Fin...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:18.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v