Newsgroup: it.comp.lang.c++
Titolo: sono diventato matto?

compilatore ms c++ 14, anche detto visual C++ 2005
const double D1 = 0.4;
const double D2 = .4;
const double D3 = 4.0/10;
D1 e D2 valgono zero, mentre solo D3 vale 0.4.
Non capisco l'arcano.
-- 
la cultura è importante: 
http://www.libreriadellautomobile.it

 Non capisco l'arcano.
Il seguente esempio
#include <iostream>
int main()
{
    const double D1 = 0.4;
    const double D2 = .4;
    const double D3 = 4.0/10;
    std::cout << D1 << '\n';
    std::cout << D2 << '\n';
    std::cout << D3 << '\n';
    return 0;
}
stampa
0.4
0.4
0.4
con Visual C++ Toolkit 2003, Borland C++ 5.5.1 e GCC 4.1.0. Se a te stampa
0
0
0.4
allora presumo sia un bug.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

 allora presumo sia un bug.
Se provo con un progetto nuovo mi stampa correttamente, se provo con il 
progetto su cui lavoro adesso mi stampa quello "buggato". Adesso indago 
su quale stramaledetto parametro del compilatore mi sta fregando.
Porco qui, porco là.


 D1 e D2 valgono zero, mentre solo D3 vale 0.4.
Come mai dici che "valgono" zero? in che modo investighi sul valore?
Lo stampi a video?

 Lo stampi a video?
Nel codice reale dopo moltiplico quelle costanti per dei valori, e mi 
da sempre zero.
Se le guardo nel visualizzatore delle variabili del debugger vedo che 
valgono zero. Ma anche stampando a video non cambia nulla. Non cambia 
nulla nemmeno tra release e debug.
Comunque con un programma giocattolo con le stesse opzioni di 
compilazione del mio progetto tutto funziona perfettamente. Ovviamente, 
quindi, il problema non è replicabile.
Ho provato a usare float, const o non const, ma non cambia nulla. 
Veramente inquietante. Purtroppo devo consegnare per oggi qualcosa, e 
quindi non posso spenderci troppo tempo. Comunque o sono pazzo io, 
oppure c'è una bomba a tempo innescata nel vc 2005. Mi è anche venuto 
il dubbio che sia un problema di CPU, ma questo mi sembra anche più 
incredibile.
Sono basito, oltre che stanco. Probabilmente è la stanchezza che non mi 
fa vedere non so che banalità davanti ai miei occhi.
Giornata di cacca, ho preso anche una multa per eccesso di velocità per 
avere sfrecciato ai 70 in aperta campagna. Porco qui, porco là.


 da sempre zero.
Humm... non è che avviene una qualche promozione a tipo intero, da
qualche parte?
Effettivamente è strano.  E' strano pure che si tratti di bug :-S...
ormai queste operazioni dovrebbero essere ordinaria amministrazione...

 Non capisco l'arcano.
Cambia il codice in
   _asm int 3
   const double D1 = 0.4;
   const double D2 = .4;
   const double D3 = 4.0/10;
- disabilita tutti i breakpoint,
- compilalo in modalità debug,
- eseguilo con F5,
- aspetta che si interrompa in corrispondenza dell'int 3,
- premi ALT+8
- copia le righe asm corrispondenti e postale sul ng.
Kiuhnm

 qualche parte?
Se metto il codice di enrico nel progetto che mi interessa non 
funziona. Mi viene da pensare che ci sia un mio bug enorme che mi ari 
la memoria, ma se metto le variabili nello stack non cambia nulla. Per 
esempio:
double pippo, pluto;
pippo = 0.4;
pluto = 1.0;
pluto *= 0.4;
Se guardo con il debugger alla fine cosa valgono pippo e pluto, esse 
valgono zero. Ovviamente solo con il mio progetto.


 - copia le righe asm corrispondenti e postale sul ng.
   _asm int 3
0051FA8B  int         3
   const double D1 = 0.4;
0051FA8C  fldz
0051FA8E  fstp        qword ptr [ebp-0FCh]
   const double D2 = .4;
0051FA94  fldz
0051FA96  fstp        qword ptr [ebp-10Ch]
   const double D3 = 4.0/10;
0051FA9C  fld         qword ptr [__real@3fd999999999999a (650820h)]
0051FAA2  fstp        qword ptr [ebp-11Ch]
invece nel progetto giocattolo che funzione mi da questo codice 
(funzionante)
   _asm int 3
004114AE  int         3
   const double D1 = 0.4;
004114AF  fld         qword ptr [__real@3fd999999999999a (417800h)]
004114B5  fstp        qword ptr [D1]
   const double D2 = .4;
004114B8  fld         qword ptr [__real@3fd999999999999a (417800h)]
004114BE  fstp        qword ptr [D2]
   const double D3 = 4.0/10;
004114C1  fld         qword ptr [__real@3fd999999999999a (417800h)]
004114C7  fstp        qword ptr [D3]


 0051FAA2  fstp        qword ptr [ebp-11Ch]
fldz inserisce 0.0 nello stack fp, quindi fstp esegue un pop dallo stack 
fp copiando il valore nella locazione di memoria, cioč in D1.
E' chiaramente un bug del compilatore.
Kiuhnm

 E' chiaramente un bug del compilatore.
Che culo. La settimana prossima vedo di segnalarlo alla Microsoft.
Comunque se il compilatore sbaglia nelle assegnazioni di costanti siamo 
messi bene.


 
Ma mettendo tipo:
double x = 0.4f;
Non cambia nulla?
Bye,
  Gabry

 Non cambia nulla?
Non cambia nulla, nemmeno a livello di assembly.


 Non cambia nulla nemmeno tra release e debug.
Questa e' la cosa piu' inquietante.
Comunque che versione di 2005 usi? La base? Hai installato il servizio pacco 
1? O la beta dello stesso servizio pacco? Altri hotfix?
Io con un progetto banale-banale non son riuscito a ricostruire il 
problema... avendo tempo provo a smanacciare con le opzioni.
--*PaN!* 

 Non cambia nulla, nemmeno a livello di assembly.
Ti consiglio di provare il codice con un altro compilatore. Potresti 
trovare qualche errore.
Kiuhnm

 1? O la beta dello stesso servizio pacco? Altri hotfix?
Vc 2005 professional edition sp 1


 qualche errore.
Cosa complicata, se non praticamente impossibile. La cosa buona sarebbe 
ricompilare togliendo cose dal progetto vedendo quando la compilazione 
va a buon fine. Però rischio di perdere un pomeriggio, cosa che 
attualmente non posso permettermi. Forse domani.
Visto che io stesso non riesco a riprodurre il problema, con lo stesso 
compilatore e un programma giocattolo, credo però che sarò obbligato a 
seguire questa strada.
Rimango dell'idea che ci sia una qualche stupidata che mi sfugge. 
Comunque vedo di tenere informato il NG. Di fare la figura dello 
stupido non mi interessa, mentre di lasciare un inutile tarlo di un bug 
del compilatore si.


Porto la mia esperienza ....
Potrebbe essere che qualche libreria che ti linki (se te la linki !)
è disallineata con i suoi .h. A me una volta è successo che :
LIB_TYPE myLibType;
MY_FUNC(myLibType);
// sfanculava alla grande
adesso non scendo nei particolari comunque successe qualche cosa
del genere. Prova a verificare se tutto il progetto è allineato in
termini di .h e librerie poi magari fai un clean solution e rebuild
Ciao.
Davide Quack ha scritto:
