PDA

Visualizza la versione completa : [C++] Errore con avvio senza debug (Visual C++)


carminio
01-12-2008, 10:54
Ciao ragazzi,
ho un problema quando tento di avviare la mia applicazione senza eseguire il debug (ma non ancora in modalità release). Visual studio mi dice: "An unhandled win32 exception occurred...". Premetto che in modalità debug funziona benissimo. Come mai? :confused:

Stoicenko
01-12-2008, 11:02
Senza conoscere il codice è molto difficile sapere il perchè.. eppoi l'errore è troppo generico.. provca a controllare lo stack trace dell'errore che viene fuori se cerchi i dettagli dell'errore..

carminio
01-12-2008, 11:40
Facendo un pò di test ho notato che questa eccezione è generata in fase di uscita dell'applicazione. E' un'applicazione basata su finestra di dialogo. Quando a fine esecuzione, la chiudo (usando il controllo con la X, per intenderci) mi genera questa eccezione. Come faccio a controllare lo stack trace dell'errore?
Grazie.

Stoicenko
01-12-2008, 11:50
bè in teoria la finestra dell'errore dovrebbe avere una scritta dettagli o un bottone non ricordo che apre la finestra dello stack trace..

cmq se è li controlla che non sia qualche puntatore o qualche oggetto che magari viene doppiamente deallocato o che è nullo ecc... Fai qualcosa alla chiusura? Se hai classi tue hai ridefinito il distruttore? se si controlla la sua esecuzione..

carminio
01-12-2008, 14:24
Allora ho individuato il punto in cui il programma genera l'eccezione, ma di fatto non ho capito perchè la genera. E' in corrispondenza della chiamata ad una funzione all'interno di un'altra funzione. Solo che mi sembra tutto ok. In ogni caso, perchè mi dà problemi solo quando non eseguo il debug? Non esiste qualche comando per liberare la memoria all'uscita del programma stesso? Ti allego in basso il codice della funzione incriminata, tieni presente che utilizzo delle chiamate a DLL esterne.


double* CSRDlg::Classify(void)

{
const int numWeights=12;

//Parser per recupero input per il classificatore
char genericRow[3000];

FILE* FileIn;
fopen_s(&FileIn,"C:\\Documents and Settings\\ruggierd\\Desktop\\NN\\Esercizi\\Esperim enti\\Speech recognition\\Speech recognizer\\DLL\\Features extractor\\FEWeights.nsw","r");

if(FileIn == NULL)
{
MessageBox("Errore nel leggere il file di input per il classificatore!\n");
exit(1);
}
int counterRow=0;
int cardFullSynapse;
const int cardWeights=12;
double *weightsDouble = new double[cardWeights];
const int numOutClassifier=2;
double *outputData=new double[numOutClassifier];

//Lettura righe
while(counterRow < 12)
{
counterRow+=1;
fgets(genericRow,3000,FileIn);
}
fscanf_s( FileIn, "%d\n", &cardFullSynapse);
for (int k = 0; k < cardWeights; k++)
{
fscanf_s( FileIn, "%lf\n", &weightsDouble[k]);
}
//Parser per recupero pesi
fclose(FileIn);

enum {NSRecallNetwork, NSLearningNetwork};
HINSTANCE hDLL = LoadDLLFunctions("C:\\Documents and Settings\\ruggierd\\Desktop\\NN\\Esercizi\\Esperim enti\\Speech recognition\\Speech recognizer\\DLL\\classifier\\CLASSIFICATORE1WITHSO FTMAX.dll");
if (hDLL)

{

void *nnClassificatore;
int CreateNet=createNetwork(nnClassificatore, NSLearningNetwork);
if (!CreateNet)
loadWeights(nnClassificatore, "C:\\Documents and Settings\\ruggierd\\Desktop\\NN\\Esercizi\\Esperim enti\\Speech recognition\\Speech recognizer\\DLL\\classifier\\Classificatore1withSo ftmax.nsw");

// Avvio classificatore

int classifierResponse=getResponse(nnClassificatore, numWeights, weightsDouble, outputData); // Questa è la chiamata che genera l'eccezione!!!!!!!!
/*if (classifierResponse)
{
printf ("\nClassifier Network response error\n");
exit(1);
}*/

delete weightsDouble;
destroyNetwork(nnClassificatore);
FreeLibrary(hDLL);

return outputData;
}

else
MessageBox("\nERROR LOADING DLL Classificatore");

return 0;

}

carminio
01-12-2008, 15:21
Sono riuscito ad isolare l'eccezione generata. In realtà ho capito che è generata anche in modalità debug solo che non me ne accorgevo poichè non avevo nessun warning evidente. Ecco il testo dell'eccezione:Eccezione first-chance a 0x7c91b3fb in SR.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x3feffffc.
Spiegatemi come devo risolverla per favore.
Grazie.

MItaly
01-12-2008, 15:29
Su che riga viene sollevata l'eccezione?

Stoicenko
01-12-2008, 15:38
sicuramente un puntatore dereferenziato male, deallocato male et simila..

carminio
01-12-2008, 15:47
La riga in cui credo si genera l'eccezione è legata alla chiamata della funzione:


int classifierResponse=getResponse(nnClassificatore, numWeights, weightsDouble, outputData);

Infatti se non eseguo questa chiamata non ho problemi.
Cosa può mai essere? Se è un problema di puntatori come posso risolverlo?
Help :cry:

MItaly
01-12-2008, 15:54
nnClassificatore è un puntatore non inizializzato, credo che il problema stia lì.

Loading