Oppure

Loading
18/07/08 20:59
Dax89
Salve a Tutti :D
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à!!

:k:
Ultima modifica effettuata da Dax89 18/07/08 21:07
aaa
19/07/08 7:02
gantonio
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?
aaa
19/07/08 8:02
Dax89
Ciao gantonio grazie per avermi risposto :D
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 19/07/08 8:05
aaa
19/07/08 8:57
gantonio
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 ...
aaa
19/07/08 9:12
Dax89
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 19/07/08 9:12
aaa
19/07/08 10:15
gantonio
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 ...
aaa
19/07/08 15:59
Dax89
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 19/07/08 16:00
aaa
19/07/08 16:10
gantonio
Ottimo ... quando avrai un codice corretto, postalo e ci do' un'occhiata ...
aaa