Newsgroup: it.comp.lang.c++
Titolo: Visual C++:Differenze tra Release e Debug

Sto sviluppando con Visual C++ 5.0 e ho dei problemi per via di
malfunzionamenti che ritrovo nella mia applicazione quando la eseguo
in versione release e che non ritrovo invece nella versione debug.
Non e' la prima volta che mi capita e la cosa mi lascia davvero
perplesso.
Vi e' gia' successo?  A cosa e' dovuto?
Alberto Rausa

ciao,
a me capita l'inverso, nel senso che in Debug vi sono
tutti gli ASSERT che, in caso di problemi, producono
apposite finestrelle di warning. In Release queste finestrelle
non appaiono ma il problema rimane. E magari si inchioda
tutto. Tipico esempio: multithreading e MFC, purtroppo
non pienamente compatibili.
ciao
--
Tiberio Grasso
Tecnomare SpA
R&D, Robotics and Space
Tel: 
+39-041-796711
Fax: 
+39-041- 796800
e-mail: 
gras...@tecnomare.it

in versione release e che non ritrovo invece nella versione debug.
A volte cio' e dovuto a diverse impostazioni del compilatore per le
modalita' Debug/Release; tieni inoltre conto che la versione debug ti
"aiuta" impostando a zero (o null) tutte le variabili automatiche non
inizializzate, cosa che la Release non fa; ad esempio,
int a;
in debug pone la variabile a a zero, in release non necessariamente.
Ciao,
Gianfranco

Ha ragione Proel, controlla le tue inizializzazioni; il debugger
fa molto piu'di quello che pensi.

non pienamente compatibili.
Colgo l'occasione: qualcuno saprebbe dirmi cosa siano esattamente
questi ASSERT e come disattivarli?
_____________________________________________________
Francesco Trotta
http://space.tin.it/computer/ftrotta
elimina "x_" dal mio indirizzo per le risposte

questi ASSERT e come disattivarli?
assert e' una chiamata che serve per inserire delle asserzioni, appunto, nel codice.
Puoi inserire delle assert in ogni punto ,dove vuoi controllare che certe cose siano
ver. Ad es. puoi scrivere
assert( index >= 0 )
prima di usare index per accedere ad un array. Le chiamate ad assert vengono
automaticamente abilitate (nel senso che funzionano) quando lavori con la debug
version, e automaticamente disabilitate (nel senso che non vengono proprio
compilate) nelle versioni di release. Tutto questo perche' assert e' condizionata
ad una macro, _DEBUG o _NDEBUG o simile, che e' vera quando compili la
versione di debug e falsa quando compili la release.
Quando una asserzione fallisce, il programma si ferma e ti da' un messaggio che
indica dove e' l'asserzione fallita. Sono molto utili.



Ho risolto. E' tutta colpa delle ottimizzazioni che nella versione
release sono abilitate e nella debug no.
Togliendole tutto e' andato a posto. Ma che cavolo di ottimizzazioni
sono se ti cambiano il comportamento del programma!!!???
Mi guardo bene dall'utilizzarle a questo punto, visto che procurano
problemi di questo genere.
Alberto Rausa

problemi di questo genere.
Qtuello che ti e' successo puo' in effetti capitare, anche se in situazioni
abbastanza rare. Gli ottimizzatori certe volte possono essere tratti in 
inganno da certi costrutti di codice, e generare autentici errori.
Studia per bene il tuo codice, e se sei sicuro che non ci sono errori
da parte tua, puoi notificare la cosa al produttore del compilatore.
Prima pero' dovresti anche andarti a leggere con attenzione le 
release notes del tuo compilatore (si' quelle che non legge mai 
nessuno), perche' spesso vi si trovano indicazioni su cose a cui 
e' bene stare attenti.
Questo non vuol dire che l'ottimizzazione vada eliminata: sono 
decisamente di piu' i casi in cui torna utile.
Se non si tratta di 10000 linee di codice, potresti postare il file 
incriminato, cosi' puoi sentire anche qualche altra campana e
magari rendere edotti anche altri su un eventuale errore dell'ottimizzatore.