Torna indietro   Hardware Upgrade Forum > Software > Programmazione

MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
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: 19150
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


MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Sony Santa Monica posticipa God of War L...
Il telescopio spaziale Swift è ri...
Black Friday HONOR, prezzi giù fi...
AliExpress sfida Amazon sui prezzi: e-bi...
Gemini sotto accusa in Ungheria: per l'a...
Windows 11 può girare sulla NPU invece d...
MediaWorld diventa cinese: l'UE dice s&i...
Akamai potenzia il proprio cloud con due...
Steam, Valve cambia le regole: le revisi...
Canva licenzia (anche) per colpa dell'IA...
Axerta: l’IA traina la crescita delle te...
Galaxy A38, la batteria cresce ma il pre...
Notifica su Facebook: 'Effettuerai la mi...
Xbox pronta a dire addio allo studio di ...
Meta stacca la spina: fine del supporto ...
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: 00:15.


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