LINUX.ORG.RU

Си, проблема точки и запятой


0

0

Здрасьте. Короче на днях тут обновился.... у меня теперь разделителем вещественных чисел в системе стал "," а не "." как раньше. Есть программка на Си. Она делает вывод команд в gnuplot (сохраняет файл с командами gnuplot, там встречаются вещественные числа). Собственно теперь не только gnuplot не понимает запятых...

Конечно можно написать свой аналог strtod() ... Может есть какой-нибудь рациональный выход из проблемы, с учётом того что у меня проект кросплатформенный?

Телепаты что-то шепчут о локали.

wfrr ★★☆
()

Не просто о локали. О setlocale телепаты шепчут.

Svoloch ★★★
()

а самое умное -- написать свой аналог strtod(). точнее, тихо упереть из glibc и вырезать на йух локалезависимость.

anonymous
()
Ответ на: комментарий от anonymous

>:( Я же сразу сказал что это плохой способ. Прога должна компилироваться ещё и под винду отмечу компилятором mingw...

anterior
() автор топика

Ух ты... а оказывается libc здесь не причём! Путём опытных экспериментов было установлено ниже следующее:

//main.cpp:
#include <stdio.h>
#include <stdlib.h>
void test()
{
const double val = 1./7.;
char buf[50];
gcvt(val, 10, (char*)buf);
printf("From printf = %f, from gcvt = %s\n", val, buf);
}
int main()
{
test();
return 0;
}

$ g++ -o main main.cpp
$ ./main
From printf = 0.142857, from gcvt = 0.1428571429

Проделываем те же операции над проектом qt4:
//main_qt.cpp
#include <QApplication>
#include <stdio.h>
#include <stdlib.h>
void test()
{
const double val = 1./7.;
char buf[50];
gcvt(val, 10, (char*)buf);
printf("From printf = %f, from gcvt = %s\n", val, buf);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
test();
return app.exec();
}

$ qmake-qt4
$make
$ ./main_qt
From printf = 0,142857, from gcvt = 0,1428571429

Во блин...

ЗЫ:
Qt обновлял вчера, до этого стоял 4.3.x, сейчас 4.4.x

anterior
() автор топика
Ответ на: комментарий от anterior

А если так:

#include <QApplication> 
#include <stdio.h> 
#include <stdlib.h> 
#include <locale.h>
void test() 
{ 
const double val = 1./7.; 
char buf[50]; 
setlocale(LC_ALL, "POSIX");
gcvt(val, 10, (char*)buf); 
printf("From printf = %f, from gcvt = %s\n", val, buf); 
setlocale(LC_ALL, "");
} 
int main(int argc, char *argv[]) 
{ 
QApplication app(argc, argv); 
test(); 
return app.exec(); 
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.