Newsgroup: it.comp.lang.c++
Titolo: il mistero del "mio" bug con vc 2005

Il codice minimale che mi genera il "mio" bugs in fase di assegnazione 
di variabili in virgola mobile è
#ifdef _MSC_VER
   #pragma setlocale( "ita" )
   //#pragma setlocale( "eng" )
#endif
int main()
{
	double b = 0.2;
	b = 0.3;
	b = 0.01;
	return 0;
}
Se setto il locale eng invece compila bene. Un bug molto particolare, e 
che interesserà forse solo me in tutto l' NG.
-- 
la cultura è importante: 
http://www.libreriadellautomobile.it

che interesserà forse solo me in tutto l' NG.
E' bizzarra, lo ammetto che è bizzarra, ma è possibile che il
compilatore adotti le convenzioni sulla valuta? che tratti quei double
come se dovessero ospitare valori currency? magari hai specificato
(nelle opzioni di internazionalizzazione) che le cifre decimali sono 0
(zero) e quindi lui considera solo il valore intero. E' molto tirata,
però l'ingerenza del locale in questo problema mi fa pensare solo a
questo...

 
prima cosa : complimenti per avere isolato il problema, immagino 
sia stato un casino.
Seconda cosa : più che bug per me (ok, io non conosco lo 
standard, e forse questo spiega molto) è proprio un aspetto 
inatteso.
Nel senso che mi aspetterei (e in VB ho incontrato molte volte 
dipendenze tra settaggi locali e comportamento del runtime) che 
i settaggi locali di diversa lingua influenzino interpretazioni 
tipicamente del runtime (come scanf e printf e analoghi C++, 
dove delle variabili stringa sono interpretate a numeriche e 
viceversa).
Viceversa aspetti che dovrebbero restare squisitamente dentro il 
compilatore, come literals di tipi nativi suoi, e non stringhe, 
mi pare una scelta cattiva di design "localizzarli". Forse 
questo è standard, non so, ma che lo sia o meno non mi piace.
Almeno i tipi intrinseci uno vorrebbe poterseli studiare nella 
univoca sintassi del linguaggio e non vederli interpretati 
secondo diverse impostazioni internazionali.
Se no se uno avesse scritto
#pragma setlocale( "chinese" ) // scherzo
avrebbe dovuto scrivere literals floating point come
b = 0@01;
Ho messo l'"at" ma volevo inserire un ideogramma, per rendere 
l'idea.
Per "consolarti", già che la giornata l'hai buttata, in VB avevo 
scoperto che coppie di istruzioni formalmente simmetriche
come val() e str() .... o forse si trattava di cstr() e cdbl(), 
beh, non erano pienamente reversibili come atteso.
Insomma, eseguendo cdbl(cstr(cdbl("0.5"))) non si riotteneva 
0.5, ma non per questioni di arrotondamenti e difetti di 
precisione, sempre per la maledetta questione della 
virgola/punto decimale. E' il genere di inconsistenza che fa un 
po' saltare la mosca al naso, perché ci voleva tanto a gestire 
entrambi i casi. Poi però ti forniscono di casa 
Eval(expression), che non ho mai neppure osato pensare di usare 
concretamente,
ciao
Soviet

 compilatore adotti le convenzioni sulla valuta? 
O più semplicemente si aspetta la virgola invece del punto come 
separatore decimale!
E.

 decimale!
Orrore!...
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
 

 decimale!
Il problema è che in C++ la virgola è un operatore (e mi capita di 
usarlo qualche volta).
Magari provo a vedere se ho lo stesso problema con i compilatori della 
microsoft precedenti. Giusto per curiosità.


 (zero) e quindi lui considera solo il valore intero.
Ovviamente no, comunque in questo caso non si capirebbe perché non 
settando nulla, o settando eng, "compili" bene.
Intanto ho aperto il bug sul sito Microsoft, e cambiato la mia libreria 
di base. Di più non potevo fare.


 e che interesserà forse solo me in tutto l' NG.
E' clamoroso! Il bug si presenta anche in VC6. E per la cronaca la virgola 
non si può poi usare al posto del punto.
-- 
Costantino Grana 

 non si può poi usare al posto del punto.
Probabilmente settando la locale con quella pragma anche il compilatore 
si setta la SUA locale in italiano, e quando va a "parsare" nei sorgenti 
0.1 con sscanf() o simili ottiene 0 :)
Bye,
  Gabry

 separatore decimale!
Non è possibile.  La virgola ha un significato preciso come operatore.

 E' clamoroso! Il bug si presenta anche in VC6.
La microsoft mi ha risposto che sono riusciti a replicare il problema, 
e che hanno passato la patata al team di sviluppo.
Ho è una cretinata da mettere a posto, o lasciano le cose così per me. 
La quantità di bugs aperti è immensa: 30.504 bug segnalati, anche se 
alla fine ora ci sono "solo" 2.030 bug aperti.
