Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Comportamento Eseguibile Inatteso
Forum - C/C++ - Comportamento Eseguibile Inatteso

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Dax89 (Member)
Expert


Messaggi: 283
Iscritto: 07/04/2007

Segnala al moderatore
Postato alle 22:59
Venerdì, 18/07/2008
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 il 18/07/2008 alle 23:07


PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 9:02
Sabato, 19/07/2008
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?

PM Quote
Avatar
Dax89 (Member)
Expert


Messaggi: 283
Iscritto: 07/04/2007

Segnala al moderatore
Postato alle 10:02
Sabato, 19/07/2008
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.


Dax89 ha allegato un file: MicroHex.zip (365241 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Dax89 il 19/07/2008 alle 10:05


PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 10:57
Sabato, 19/07/2008
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 ...

PM Quote
Avatar
Dax89 (Member)
Expert


Messaggi: 283
Iscritto: 07/04/2007

Segnala al moderatore
Postato alle 11:12
Sabato, 19/07/2008
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


PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 12:15
Sabato, 19/07/2008
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 ...

PM Quote
Avatar
Dax89 (Member)
Expert


Messaggi: 283
Iscritto: 07/04/2007

Segnala al moderatore
Postato alle 17:59
Sabato, 19/07/2008
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


PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 18:10
Sabato, 19/07/2008
Ottimo ... quando avrai un codice corretto, postalo e ci do' un'occhiata ...

PM Quote
Avatar
Dax89 (Member)
Expert


Messaggi: 283
Iscritto: 07/04/2007

Segnala al moderatore
Postato alle 15:05
Domenica, 20/07/2008
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 ^^



Dax89 ha allegato un file: MicroHex.zip (844892 bytes)
Clicca qui per scaricare il file


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo