GNU C: сбой atof(), strtof() и strtod() (Debian для BeagleBoard)

У меня есть некоторый код C, который преобразует строку ASCII в удвоение с помощью strtod(...). Программа скомпилирована для x86 (отладка), ARM и PowerPC (встроенные целевые системы). Плата ARM на самом деле представляет собой BeagleBoard xM, на котором установлен Debian.

Я обнаружил, что strtod() неправильно конвертирует значения в системе ARM / Debian. Фактически все значения, которые я попробовал, вышли как 0,000.

Для демонстрации я написал следующую очень простую тестовую программу:

#include <stdio.h>
#include <stdlib.h>

int main(const int argc, const char **argv)
  {
  const char myString[] = "123 ";
  char *myEnd1 = NULL;
  char *myEnd2 = NULL;

  float  fValue = 0;
  double dValue = 0;

  dValue = atof(myString);

  printf(   "Using atof():\n"
            " String:  %s\n"
            " Double:  %lf\n",
             myString,
             dValue                           );

  fValue = strtof(myString, &myEnd1);
  dValue = strtod(myString, &myEnd2);

  printf(   "Using strtof() / strtod():\n"
            " String:  %s\n"
            " Float:   %f (%d)\n"
            " Double:  %lf (%d)\n",
            myString,
            fValue, (myEnd1 - myString),
            dValue, (myEnd2 - myString)             );

  return 0;
  }

Все они были скомпилированы на компьютере x86 под управлением Ubuntu (фактически на виртуальной машине). У меня есть кросс-компиляторные наборы инструментов для компиляции PowerPC и ARM.

В системах x86 и PowerPC выходные данные соответствуют ожидаемым, т.е.

Using atof():
 String:  123 
 Double:  123.000000
Using strtof() / strtod():
 String:  123 
 Float:   123.000000 (3)
 Double:  123.000000 (3)

Тем не менее, при запуске на BeagleBoard, я получаю это:

Using atof():
 String:  123
 Double:  0.000000
Using strtof() / strtod():
 String:  123
 Float:   -0.372039 (3)
 Double:  0.000000 (3)

Да??? Я что-то упустил глупый? Обратите внимание, что указатели "myEnd" как раз и показывают, что strtod() и strtof() действительно нашли первый нечисловой символ и, следовательно, конец числа. Они сообщают правильное количество символов в числе в обоих случаях (3), но преобразованное значение неверно. Я не думаю, что это локальная проблема, так как нет запятой, в которой можно запутаться.

РЕДАКТИРОВАТЬ:

Я просто перекомпилировал тестовую программу с опцией "-static". Конечно, это сделало бинарный файл намного больше, но теперь он корректно работает на целевой платформе ARM.

Я немного запутался в том, как работают библиотеки. Кроме того, я не могу точно вспомнить, как я построил свой кросс-компилятор. Вероятно, он не был собран из того же источника, что и Debian Linux, установленный на целевой плате.

Итак, означает ли необъяснимое поведение atof() и т. Д., Что библиотека, ожидаемая динамически связанным исполняемым файлом, не совпадает с реальной библиотекой в ​​системе? Я удивлен, что это не вызвало худших проблем. Мы работаем с этой системой в течение года, и пока это единственная странная ошибка, с которой мы столкнулись.

0 ответов

Другие вопросы по тегам