Embedded 图C18:将双精度转换为字符串

Embedded 图C18:将双精度转换为字符串,embedded,microcontroller,pic,c18,Embedded,Microcontroller,Pic,C18,我使用的是PIC18F2550。用C18语言编程。 我需要一个将double转换为字符串的函数,如下所示: void dtoa( char *szString, // Output string double dbDouble, // Input number unsigned char ucFPlaces) // Number of digits in the resulting fracti

我使用的是PIC18F2550。用C18语言编程。
我需要一个将double转换为字符串的函数,如下所示:

void dtoa(  char *szString,             // Output string
            double dbDouble,            // Input number
            unsigned char ucFPlaces)    // Number of digits in the resulting fractional part
{
    // ??????????????
}
在主程序中这样调用:

void main (void)
{
    // ...
    double dbNumber = 123.45678;
    char szText[9];
    dtoa(szText, dbNumber, 3); // szText becomes "123.456" or rounded to "123.457"
    // ...
}
所以写一个

5分钟,一张相纸和一杯咖啡就足够了。
事实上,这是一个很好的面试问题,所以写一个吧

5分钟,一张相纸和一杯咖啡就足够了。

事实上,这是一个很好的面试问题

Tiny printf可能适合您:

Tiny printf可能适合您:

一般来说,Newlib C库(BSD许可证,来自RedHat,Cygwin的一部分,用于许多“裸机”嵌入式系统编译器)对于标准C库中的有用资源来说,这是一个很好的起点

Newlib
dtoa.c
源位于源代码树的
src/Newlib/libc/stdlib
子目录中:

  • 联机源浏览器:
  • 直接链接到当前版本的
    dtoa.c
    文件:

这个文件会有点奇怪,因为Newlib使用了一些奇怪的宏来声明函数,但是应该可以直接进行修改——而且,由于获得了BSD许可,如果您保留了版权声明,您几乎可以对它做任何您想做的事。

通常,Newlib C库(BSD许可证,来自RedHat,是Cygwin的一部分,并用于许多“裸机”嵌入式系统编译器)是一个很好的起点,可以从标准C库中的有用资源开始

Newlib
dtoa.c
源位于源代码树的
src/Newlib/libc/stdlib
子目录中:

  • 联机源浏览器:
  • 直接链接到当前版本的
    dtoa.c
    文件:

这个文件会有点奇怪,因为Newlib使用了一些奇怪的宏来声明函数,但是应该可以直接进行修改——而且,由于获得了BSD许可,如果你保留了版权声明,你几乎可以对它做任何你想做的事。

sprintf()然后找到“.”并将正确的十进制字符设为null?@kenny sprintf()可能有点晕眩PIC@MartinBeckett如果你有足够的空间,我相信它是可用的。或者你可以自己使用dtoa()“可用”可能是一个微妙的问题,因为像MISRA这样的标准禁止使用变量参数……我在PIC18上一直使用sprintf,而且也是双倍的。sprintf()然后找到“.”并将正确的十进制字符设为null?@kenny sprintf()可能在一个PIC@MartinBeckett如果您有足够的空间,我相信它是可用的。或者使用您自己的dtoa()“可用”这可能是一个微妙的问题,因为像MISRA这样的标准禁止使用变量参数……我在PIC18上一直使用sprintf,而且也是双倍的。正如在那页上提到的:“当然,它很小,有局限性,不支持浮点…”啊,是的,很好的捕获。现在我隐约记得在我们自己的浮点中滚动。正如在那页上提到的:“当然很小,它有限制,没有浮点支持…”啊,是的,很好的捕获。现在我隐约记得在我们自己的浮点中滚动。