[gelöst] [C++] locale decimal point

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

[gelöst] [C++] locale decimal point

Beitrag von BeRsErKeR »

Hallo ich bin gerade auf ein seltsames Problem gestoßen. Und zwar habe ich die Funktion strtod benutzt um einen String in einen Gelitkommawert zu konvertieren. Dabei hat der endptr immer auf den Dezimalpunkt gezeigt, was soviel bedeutet, wie: Die Konvertierung wurde nach der Zahl vorm Dezimalpunkt abgeschlossen. Nach langem rätseln kam ich drauf, dass vielleicht die deutsche locale genutzt wird und strtod das normale Komma für Gleitkommawerte erwartet. Also habe ich ein setlocale(LC_NUMERIC, "C") aufgerufen und schon gings. Soweit so gut.

Nun habe ich aber gesehen, dass standardmäßig immer die C locale gesetzt ist wenn man ein Programm startet und es wird auch nirgends ein setlocale im Code aufgerufen. Das war schonmal sehr merkwürdig. setlocale gibt weiterhin den vorher gesetzten Wert zurück. Ich war erstaunt, dass vorher schon die C locale aktiv war.

Mit localeconv habe ich mir vorm setlocale mal den decimal_point wert der lconv structure anzeigen lassen und da steht tatsächlich ein normales Komma drin, obwohl die C locale aktiv ist! In allen Dokus steht nun aber (was auch Sinn macht), dass in der C locale ein Punkt als Dezimal-Trennzeichen genutzt wird. Nun verstehe ich aber die Welt nicht mehr. Zumal es bei einem erneuten Aufruf von setlocale(LC_NUMERIC, "C") dann wieder geht, also der Punkt genutzt wird. Wieso aber nicht am Anfang?

Hat jemand eine Idee?

Ich nutze Ubuntu 10.04 (Lucid Lynx) und g++ 4.4.3. Der Fehler trat bislang nur bei einem Rechner auf aber eigentlich sollte das ja rechnerunabhängig sein. Umgebungsvariablen sollten eigentlich auch ignoriert werden, sofern ich kein setlocale(LC_NUMERIC, "") aufrufe und wie gesagt ist die C locale ja aktiv.


EDIT: Ich hab das Problem gefunden.

1. Gibt setlocale den neuen Wert zurück. Daher erhalte ich "C", weil ich ja gerade "C" gesetzt habe.
2. Der Testcase war ein Gtk::Window und der Gtk::Main Konstruktor bzw das gtk_init setzt intern die locale auf "" (default), damit die Glib::ustrings richtig funktionieren.
Ohne Input kein Output.
Antworten