Newsgroup: it.comp.programmare.win32
Titolo: Problema con la memoria?

Salve!
Ho un problema con un programma scritto da me in C.
In breve il problema è questo: il mio programma (utilizzando una delle
funzioni fornite dall'SDK di un sensore per il rilevamento i impronte
digitali) deve confrontare tra di loro di svariate coppie di immagini e
restituire il punteggio di somiglianza delle due impronte salvando i
risultati su un file txt.
Il problema è che quando dico "svariate coppie di immagini", in realtà
intendo dire che i confronti che il programma deve fare sono 1428000 (ebbene
sì, quasi un milione e mezzo).
Ovviamente (almeno credo che sia ovvio), il mio programma dopo circa 500
confronti esce e torna al prompt (senza nessun messaggio di errore) oppure
addirittura fa flippare il computer.
Ho pensato di scomporre tutti i cicli for che generano le coppie da
confrontare in modo da avere ogni volta un numero pari a 500 confronti ma
dovrei effettuare questa modifca 2856 volte, e ogni volta rilanciare il
programma modificando i parametri (in pratica dovrei fare a mano il ciclo
for incrementando ogni volta a mano il contatore)... direi che la cosa non è
fattibile.
Qualcuno sa suggerirmi un modo per affrontare la questione?
Grazie mille
-- 
Elminster 

 errore) oppure addirittura fa flippare il computer.
Ovviamente il programma ha uno o più bug. Bisogna usare un debugger.
Per prima cosa, se allochi della memoria, cosa molto probabile, assicurati 
che non ci siano memory leak. Cerca nell'help di VC come fare. Altro test da 
fare è compilare il programma in modalità DEBUG ed eseguirlo tramite il 
debugger. Attenzione che molti fanno l'errore di eseguire poi con CTRL-F5 
(in VC) che è diverso da F5.
Seconda cosa, il tipo di errore fa pensare a sforamenti di memoria. 
Probabilmente sullo stack. Se allochi delle variabili di tipo array sullo 
stack assicurati sempre di scrivere entro i limiti.
Insomma, confrontare un milione di immagini non è così drammatico. Anche se 
non ha molto senso. Normalmente si estrae un riassunto di qualche tipo (ad 
esempio minuzie e cose simili) e poi si fa un confronto su questo riassunto, 
magari usando un indice, tipo embedding o k-d tree.
-- 
/* Costantino Grana                                */
main(int c,char**o){char*s=c?"+L7?+;:7?+:OKIK+9?;9=;"
":+9?;:<:;+9?;;;:;+9<:;<::;+RLJ;K9+":1[o],t,a=!c,m;do
for (m=*s-'0',t=a?m/c:m%c;m>>7?c=1<<m+8,!a&&puts(&a)*
*&a:t--;printf("  \0/*"+a));while ((a^=3)||a[++s]);;}
/* Original code due to Chris Brown... impressive! */

 confronto su questo riassunto
E' quello che dovrebbe fare la funzione FX3_Matching infatti. Non credo 
lavori sulle immagini intere.
Mi serve perchè devo creare degli istogrammi riportando l'andamento dei 
matching score genuini e di quelli impostori e poi da lì partire per fare 
altri lavori.
-- 
Elminster 

 err=FX3_LoadFingerprintFromFile(fingerprint,&quality);
non dovresti liberare la memoria allocata in uno dei modi di cui sopra?

 malloc che ho usato? 
[cut]
scusa ma non posso leggere tutto ... hai liberato la memoria dopo averla 
allocata?

 averla allocata?
Credo di sě.
-- 
Elminster 

 sopra?
In realtà tutte queste funzioni caricano i modelli/impronte in un'area 
predefinita della memoria riservata quando all'inizio del programma io 
lancio la funzione:
err=FX3_Init();
 if (err) { printf("\nErrore di inizializzazione:%d",err);FX3_End();return 
1;}
      else printf("\nInizializzazione OK");
E allo stesso modo dovebbe venire rilasciata quando alla fine lancio il 
comando:
err=FX3_End();
if (err) { printf("\n Errore in uscita:%d",err); return 1;}
return similarity;
Anche perchè non c'è modo di accedere a quell'area di memoria dove le 
funzioni dell'SDK salvano *temporaneamente* impronte e modelli.
-- 
Elminster 

"Elminster" <elminste...@QUESTOtin.it> ha scritto nel messaggio news:BNLCe.80694$h5.33...@news3.tin.it...

Strano che non ci sia una API che permetta di rilasciare la memoria.
In questo caso dovresti inizializzare e poi terminare l'ambiente, non dico ad ogni elaborazione, ma almeno ogni tot che decidi tu in base alla memoria disponibile.

 per fare altri lavori.
Ok, allora è molto più logico.


 errore:%d",model,err); return 1;}
Se hai err=True fai una return e la memoria allocata che fine fa?
Comunque hai per caso notato da TaskManager ceh la memoria sale sempre?
-- 
_________________________________________
Edmondo Di Tucci snar...@Tlibero.it
guarda i miei lavori su: 
www.powernetsi.it/edmondo

 Ho un problema con un programma scritto da me in C.
Ragazzi, grazie a tutti... sono riuscito a risolvere il problema!!! :-)))
Praticamente l'errore era dovuto al fatto che ogni volta il ciclo rilanciava 
le due funzioni dell'SDK Init() e End().
Queste due funzioni evidentemente non fuzionavano correttamente e creavano 
dei memory leak (anche se in realtà il manuale stesso dell'SDK diceva che 
prima di ogni confronto doveva essere lanciata la Init e subito dopo la 
End).
In realtà però facendo così il programma dopo un po' si flippava: è bastato 
inserire la Init all'inizio della main e la End alla fine per risolvere 
tutti i problemi.
Grazie di cuore comunque a tutti per l'aiuto che mi avete dato (e per la 
vostra pazienza)! ;-)
-- 
Elminster