2016-02-09 3 views
7

Ich habe zwei Beispielanwendungen mit der gleichen Bibliothek und der Hauptunterschied zwischen ihnen ist, dass man qt und die andere Anwendung ist eine Konsolenanwendung.const char * zu doppelte Übersetzung Problem mit C++

In der gemeinsamen Bibliothek, ich habe diesen Test-Code:

double test = 0.1; 
double test2 = atof("2.13134"); 
double test3 = atof("1,12345"); 

Die Werte, wenn ich die nicht-qt-Anwendung sind:

test = 0.10000000000001 
test2 = 2.1323399999999999998 
test3 = 1 // This is the expected result using a ',' as delimitation character 

Aber mit der qt Anwendung:

test = 0.10000000000001 
test2 = 2  // This is not expected!!! 
test3 = 1.1234500000000000001 

Gibt es einen Fall, in dem sich das Verhalten von 'atof' ändert, weil qt?

+0

Qt verwendet Vorverarbeitung des Codes, die nicht gut Dinge tun können. Oder es könnte ein Makro im Spiel sein. –

+0

@ Cheersandhth.-Alf Dies sieht eher wie ein Gebietsschema aus (denken Sie daran, dass ',' das Dezimalzeichen in vielen Gebietsschemas ist) - vielleicht setzt Qt ein nicht-standardmäßiges Gebietsschema basierend auf Systemeinstellungen? – Angew

+0

Für jemanden aus Deutschland ist die Qt-Anwendung korrekt. – PaulMcKenzie

Antwort

7

std::atof hängt vom aktuell eingestellten Gebietsschema ab, welches Zeichen der Dezimalpunkt ist. Im Standardfall ("C locale") ist dies das Periodenzeichen ".".

Es ist wahrscheinlich, dass Qt das Gebietsschema auf etwas anderes setzt. Sie können das unter Verwendung der standard C[++] mechanism:

std::setlocale(LC_ALL, "C"); 
+0

Ich habe 'std :: setlocale (LC_ALL, "C");' im Konstruktor der Klasse in der Bibliothek, und es funktioniert jetzt. Vielen Dank!!! – goe

+0

@goe: Es könnte eine gute Idee sein, zu überprüfen, ob schmale String-Literale mit internationalen Zeichen nun korrekt als Qt-Strings enden. –

4

Das Problem, das Sie bemerken, wird wahrscheinlich von Qt's Gebietsschema verursacht. Sie können:

QLocale::setDefault(QLocale::C); 

, um es wie atof zu arbeiten.

aktualisieren

Es QLocale::setDefault nicht das Standardgebietsschema von Qt verwendet gesetzt ist scheint. Es legt nur das Standardgebietsschema fest, das beim Erstellen eines QLocale erstellt wird. Siehe Changing locale in Qt und die akzeptierte Antwort für weitere Informationen.

Verwandte Themen