Автор Гілка: Кляті бібліотеки! не можу більше  (Прочитано 6248 раз)

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Проблема наступна: треба завантажити конкретну функцію з конкретної бібліотеки при чому перекриваюча функція завантажена і нахабно заважає працювати ;)
Справа в тому, що хочу використати strtod з stdlibc а завантажена glibc, її функція реагує на локаль, що мені аж ніяк не потрібно. Треба розглянути поля з бази даних (грубо кажучи, іншими словами треба працювати з файлом, вмісту якого має бути начхати на локаль - мається на увазі xml файл з данними) .
Або підкажіть яку функцію, яка не належить glibc і переводить в числа з плаваючою точкою строки, які складаються з цифр і крапки, а не коми з китайськими ієрогліфами ;)
Ну не писати ж мені функцію замінника, коли вже існує одна.
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній DalekiyObriy

  • Літератор
  • ******
  • дописів: 1929
  • Карма: +5/-0
Re: Кляті бібліотеки! не можу більше
« Відповідей #1 : 2008-06-20 01:45:00 »
а може простіше

setlocale( LC_NUMERIC, ... )
...
strtod(...)

?
Fedora 35 (x86-64)

fk4mam

  • Гість
Re: Кляті бібліотеки! не можу більше
« Відповідей #2 : 2008-06-20 10:54:20 »
Off-topic:
До адміна: приберіть, будьласка, прив'язку esc до "скинути" або нехай хоч перепитує перед скиданням - воістину занадто нерозумна функція для клавіші, яку можна натискати ненароком.
Ескейпав вибрик миші, а воно мені все набране до дідька послало.
Питання ж в обходженні налаштувань локалі. Тобто щоб один і той же набір даних міг використовуватись хоч і китайцями чи арабами з їх ієрогліфами, а не в переналаштовуванні її якось смішно переналаштовувати локаль для однієї функції (а якщо треба, щоб вивід на термінал йшов в локалі користувача - совати локаль туди-сюди?). Вже краще вигрепати потрібну функцію з stdlibc і перейменувавши вставити в код (в цьому перевага опенсорса).
В когось є красиве рішення цієї проблеми?

Відсутній raven

  • Новачок
  • *
  • дописів: 0
  • Карма: +0/-0
  • linux kettle
Re: Кляті бібліотеки! не можу більше
« Відповідей #3 : 2008-06-20 11:16:39 »
В когось є красиве рішення цієї проблеми?
Чим запропоноване DalekiyObriy некрасиве? Аргумент "смішно" смішний.

Praporshic

  • Гість
Re: Кляті бібліотеки! не можу більше
« Відповідей #4 : 2008-06-20 11:33:23 »
Off-topic:
китайцями чи арабами з їх ієрогліфами
А з яких це пір у арабській писемності використовуються ієрогліфи?

xbvjm3

  • Гість
Re: Кляті бібліотеки! не можу більше
« Відповідей #5 : 2008-06-20 12:27:52 »
Чим запропоноване DalekiyObriy некрасиве? Аргумент "смішно" смішний.
Бо переналаштування локалі для того, щоб попарсити число з плаваючою точкою - постріл з танка пого горобцю: результат має не завжди естетичний вигляд.

Відсутній raven

  • Новачок
  • *
  • дописів: 0
  • Карма: +0/-0
  • linux kettle
Re: Кляті бібліотеки! не можу більше
« Відповідей #6 : 2008-06-20 12:48:07 »
Чим запропоноване DalekiyObriy некрасиве? Аргумент "смішно" смішний.
Бо переналаштування локалі для того, щоб попарсити число з плаваючою точкою - постріл з танка пого горобцю: результат має не завжди естетичний вигляд.
Гм. А поставити назад на системну релігія не дозволяє? Якщо це вас так турбує перформанс:
#include <locale.h>

int main(void)
{
    int i;
    for (i=0; i < 1e6; ++i)
    {
        setlocale(LC_NUMERIC, "C");
        setlocale(LC_NUMERIC, "UK_UA.utf8");
    }
    return 0;
}

$ gcc test.c -o test
$ time ./test
./test  1,35s user 0,03s system 99% cpu 1,385 total
Для вас це забагато?

cx8vdv

  • Гість
Re: Кляті бібліотеки! не можу більше
« Відповідей #7 : 2008-06-20 13:07:23 »
Геніальна простота: залишилось впарити цей код арабу з китайською розкладкою або тому ж москалеві чи молдовану  ;D

Відсутній mim

  • Новачок
  • *
  • дописів: 44
  • Карма: +0/-0
Re: Кляті бібліотеки! не можу більше
« Відповідей #8 : 2008-06-20 13:37:01 »
Raven, для чистоти експерименту треба робити так:
$gcc ttlc.c -o ttlc -O0
$ time ./ttlc
4.48user 0.00system 0:04.49elapsed 99%CPU

cij7sq

  • Гість
Re: Кляті бібліотеки! не можу більше
« Відповідей #9 : 2008-06-20 13:38:20 »
А ще краще побити програму на потоки щоб вони конфліктували локалями  ;D

Відсутній raven

  • Новачок
  • *
  • дописів: 0
  • Карма: +0/-0
  • linux kettle
Re: Кляті бібліотеки! не можу більше
« Відповідей #10 : 2008-06-20 13:55:19 »
Raven, для чистоти експерименту треба робити так:
$gcc ttlc.c -o ttlc -O0
$ time ./ttlc
4.48user 0.00system 0:04.49elapsed 99%CPU
Ну... тоді вже краще просто -funroll-loops, щоб прибрати час на преінкремент.

У всякому разі, будь-який рівень оптимізації дає однаковий порядок. Так що це вже інша тема для обговорення=)

Відсутній Soft

  • Кореспондент
  • ***
  • дописів: 100
  • Карма: +0/-0
  • Чому саме Лінукс?
Re: Кляті бібліотеки! не можу більше
« Відповідей #11 : 2008-06-20 14:29:20 »
#include <locale.h>

int main(void)
{
    int i;
    for (i=0; i < 1e6; ++i)
    {
      char* locale,buf[20];
                  locale=getlocale(LC_NUMERIC);
                  strcpy(buf,locale);
        setlocale(LC_NUMERIC, "C");
        setlocale(LC_NUMERIC, buf);
    }
    return 0;
}

а так можна?

Відсутній raven

  • Новачок
  • *
  • дописів: 0
  • Карма: +0/-0
  • linux kettle
Re: Кляті бібліотеки! не можу більше
« Відповідей #12 : 2008-06-20 14:53:15 »
     char* locale,buf[20];
                  locale=getlocale(LC_NUMERIC);
                  strcpy(buf,locale);
Ну, якщо хочеться замірити з часом на виконання getlocale і strcpy, то можна. Але навіщо?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Кляті бібліотеки! не можу більше
« Відповідей #13 : 2008-06-20 15:11:41 »
#include <stdio.h>

#define __USE_GNU 1
#include <locale.h>

char *def = "12.3456";

int
main (int argc, char **argv)
{
  char *s;
  char *endp;
  double d=0.0;
  locale_t c_locale;

  // Set default locale
  setlocale (LC_ALL, "");

  if ( argc > 1)
    s=argv[1];
  else
    s=def;
  endp=s;

  printf("String: %s\n", s);

  // Create "C" locale
  c_locale = newlocale(LC_ALL_MASK, "C", NULL);

  if (c_locale == NULL)
  {
    puts("Cannot get C locale.\n");
    return 1;
  }

  // Convert string to double using "C" locale
  d = strtod_l (s, &endp, c_locale);

  if (s != endp && *endp == '\0')
    printf("%s - it's a float with value %.2lf\n", s, d);
  else
  {
    printf("%s - it's not a number.", s);
  }

  // Free unused locale
  freelocale(c_locale);
}

Прикол в тому, що в мене strtod взагалі не працює.  :o

#include <stdio.h>

int
main (int argc, char **argv)
{
  char *endp;
  double d;

  d=1.2;
  printf("%f\n", d);

  d=strtod ("1.2", NULL);
  printf("%f\n", d);

  d=strtod ("1,2", NULL);
  printf("%f\n", d);
}


$ ./test
1.200000
1072902963.000000
1072693248.000000
[Fedora Linux]

Відсутній Soft

  • Кореспондент
  • ***
  • дописів: 100
  • Карма: +0/-0
  • Чому саме Лінукс?
Re: Кляті бібліотеки! не можу більше
« Відповідей #14 : 2008-06-20 15:12:10 »
З розрахунку на китайців з арабами