GNU C:ATOF(),strtof()和关于strtod()失败(Debian的用于Beagle

2019-10-20 22:38发布

我有一个转换的ASCII字符串双用的strtod(...)的一些C代码。 该程序被编译为86(调试),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;
  }

所有汇编(在虚拟机实际上)运行Ubuntu在x86 PC上。 我对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(),等的无法解释的行为,是指一库“预期”,由动态链接的可执行文件是不一样的系统上的实际库? 我很惊讶,这并没有造成更严重的问题。 我们已经运行这个系统了一年,到目前为止,这是我们遇到的唯一奇怪的错误。

文章来源: GNU C: atof(), strtof() and strtod() fail (Debian for BeagleBoard)
标签: c linux strtod