【问题标题】:Convert string to float将字符串转换为浮点数
【发布时间】:2016-08-25 13:21:40
【问题描述】:

我正在使用 AtmelStudio 在 AVR XMEGA 微控制器上编程。

我无法将字符串转换为浮点数。该字符串称为token2,其值为"8.604165"

我已经尝试了几个功能:

  • float lon = atof(token2); printf("lon=%f", lon); 返回lon=?
  • float lon = strtod(token2, NULL); printf("lon=%f", lon); 返回lon=?
  • float lon = strtof(token2, NULL); printf("lon=%f", lon); 给出错误undefined reference to strtof,甚至包括<stdlib.h>

我做错了吗?

【问题讨论】:

  • 你的代码可以没问题:look at this example
  • 请发帖Minimal, Complete, and Verifiable example。你在为微控制器写一些代码吗?如果是,请指定环境。可能相关:c - Arduino: printf/fprintf prints question mark instead of float - Stack Overflow
  • 是的@MikeCAT。我正在 AVR XMega 微控制器上编程
  • 看起来您的问题出在printf,而不是转换。试试printf("lon=%f", 8.604165);,告诉我们你看到了什么。顺便说一句,在第三个项目符号中,我不会将其描述为“返回错误”,因为这里没有“返回”(这是编译错误,而不是运行时错误)。
  • 另外,请使用调试器,告诉我们在调用atof和调用strtod之后lon的值是多少。

标签: c string floating-point microcontroller


【解决方案1】:

默认情况下,AVR-libc 尝试通过不链接浮点相关内容来节省二进制文件中的空间。对于像atof 这样的函数,这很容易,因为如果您不调用它们,那么链接器将不会包含它们。但是,对于 printf,链接器无法判断您是否打算将其用于浮点数。

相反,AVR-libc 有多个定义printf 的库。默认库中的printf 具有完整的功能,只是它不支持浮点数。如果您想在二进制文件中节省空间并且没有使用printf 的更高级功能(即格式标志),您可以与printf_min 链接以将其替换为更小的版本。如果要打印浮点数,则需要printf_flt 中定义的完整版本。

This page 描述了选择这些替代版本的正确链接器选项。简而言之,将-Wl,-u,vfprintf -lprintf_flt -lm 添加到您的链接器选项中。

【讨论】:

    【解决方案2】:

    好的,这是微控制器特有的。

    与@Sneftel 所说的类似,我只需在 AtmelStudio 中添加库 libprintf_flt.alibm.a

    【讨论】:

    • 它不仅特定于这个 IDE,这种方法在较小的微控制器中相当普遍,因为处理浮点数会为空间受限设备的代码大小增加相当多的膨胀。在某些设备中,浮点数学完全不存在,而在其他设备中,它是一个链接器选项来改变包含的版本。
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多