Dax89 (Member)
Expert
Messaggi: 283
Iscritto: 07/04/2007
|
Salve a Tutti
Da due giorni combatto con un problema stranissimo: quando compilo il mio progetto C++ (uso Visual Studio 2008) non da errori e avviandolo col classico CTRL+F5 o col debugger di visual studio il programma 'gira' correttamente, ma se ci clicco sopra col classico doppio click mi dice:
--------------------
L'istruzione 0x7c921e58 ha fatto riferimento alla memoria 0x00000000. La memoria non poteva essere read.
--------------------
Se lo sposto dalla cartella 'Release' invece viene eseguito ma appena clicco sul tasto Apri a volte capita che il programma si chiuda all'improvviso.
Putroppo non posso debuggare perchè (ripeto) avviato con un debugger funziona correttamente.
Se qualcuno ha avuto a che fare con questo problema o simile, magari mi può dare qualche informazione in più perchè io non so più cosa provare. (il programma è scritto direttamente col le API, senza l'utilizzo delle MFC)
Grazie in anticipo a chi mi risponderà!!
Ultima modifica effettuata da Dax89 il 18/07/2008 alle 23:07 |
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Quell'errore indica un problema con un puntatore (un cattivo uso di un puntatore).
Ma se non mostri il codice, come si fa a dirti qual e' il problema?
|
|
Dax89 (Member)
Expert
Messaggi: 283
Iscritto: 07/04/2007
|
Ciao gantonio grazie per avermi risposto
Faccio prima a caricare la soluzione (VS 2008) perchè i sorgenti sono molti.
Non posso debuggarlo perchè (ripeto) avviato con un debugger funziona perfettamente.
Ultima modifica effettuata da Dax89 il 19/07/2008 alle 10:05 |
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
In effetti ci sono dei problemi ... sicuramente, da qualche parte, in modo abbastanza casuale ma causato da qualche di programmazione, vengono sporcate delle variabili (forse dei puntatori) e quindi hai dei comportamento anomali casuali.
Ho ricompilato il tutto con il 2005 (devo installare il 2008) e provando ho notato che esiste un errore "logico" nella riga
SetWindowPos( item.wnd, 0, newR.left, newR.top, newR.right, newR.bottom, flags );
in anchors.h
perche' la variabile newR NON e' inizializzata e il suo valore, in determinate condizioni, non e' definito (a volte nessuna if provvede a usare la newR).
Questo e' un problema ma NON e' la causa del comportamento anomalo (ti sta a dimostrare che possono esserci problemi "nascosti" e difficili da individuare ...).
Poi ho avuto un bel po' (una quarantina) di warning su conversione di tipi utilizzati nel programma e questo POTREBBE diventare fonte di comportamenti anomali. Se un valore di un tipo viene convertito in un altro tipo in maniera poco accorta, si possono perdere "pezzi" del valore originale con comportamenti indefiniti. Ti consiglio di esaminare ed eliminare qualsiasi warning.
Infine, una cosa che mi ha subito meravigliato ... tu scrivi del codice nei file .h ! E questo NON e' corretto ... nei file .h NON va codice eseguibile ma soltanto dichiarazioni ... Il codice lo devi inserire nei .cpp ...
Infine, il problema potrebbe anche essere in quella DLL che utilizzi e di cui non ci sono i sorgenti ...
|
|
Dax89 (Member)
Expert
Messaggi: 283
Iscritto: 07/04/2007
|
Grazie per l'analisi, i warnings li avrei eliminati col tempo, perchè il set di classi che ho fatto non è ancora maturo.
Uhm, so che non si scrive codice nei files *.h ma si mette solo l'interfaccia, però ho fatto così perchè lì ci sta il mio set di classi per fare interfaccie grafiche e tenerlo tutto nei files *.h mi sembrava più pratico, ora elimino i warnings e debuggo riga per riga, se risolvo ti faccio sapere cos'era.
La DLL RaHexEd.dll non lo scritta io i sorgenti si trovano in rete (fa parte di RadASM) è scritta col MASM.
Grazie ancora!!
Ultima modifica effettuata da Dax89 il 19/07/2008 alle 11:12 |
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Dopo avere installato il 2008, do' un'occhiata piu' approfondita anche io ... ma tu comincia ad eliminare il codice dai .h e inseriscilo nei corrispondenti .cpp ...
|
|
Dax89 (Member)
Expert
Messaggi: 283
Iscritto: 07/04/2007
|
Allora ho separato l'interfaccia dal implementazione, visto che c'ero ho fatto anche un header precompilato così compila più velocemente.
Ho messo i warnings a livello 4 e i 'Basic Runtime Checks', poi ho commentato la parte iniziale del programma per evitare che partisse, permettendomi così di provare la classe String come se fossi in un programma console.
Mi è apparso subito un 'Debugger Assertion Error' che praticamente diceva che scrivevo oltre la grandezza dell'array, ora finalmente, che il debugger mi dice qualcosa posso aggiustare tutto, ho eliminato anche quasi tutti gli avvisi del compilatore e ho cambiato lo strcpy che usavo con strcpy_s
Ultima modifica effettuata da Dax89 il 19/07/2008 alle 18:00 |
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Ottimo ... quando avrai un codice corretto, postalo e ci do' un'occhiata ...
|
|
Dax89 (Member)
Expert
Messaggi: 283
Iscritto: 07/04/2007
|
Ecco, ora funziona, ci sono ancora degli avvisi da parte del compilatore e il codice va un po' 'allegerito'; col tempo continuo a mettere tutto a posto.
Il bug stava principalmente nella classe 'String', scriveva oltre la grandezza dell'array, un bug minore stava nell'array dinamico (Array.h), e altri due nelle classi OpenFileDialog e SaveFileDialog, prendevano il nome del file senza contare lo '\0'.
Ecco il codice corretto, grazie dell'aiuto ^^
|
|