【问题标题】:Why are my floats not printing in C but my ints are?为什么我的浮点数没有在 C 中打印,但我的整数是?
【发布时间】:2020-07-17 23:03:48
【问题描述】:

我的花车没有打印到 C 中的控制台,我不知道为什么。 ints 打印很好,所以我很困惑为什么浮动是。代码如下:

float temp = 9.5;
u8_t buf[strlen("temp (K): %.2f\n") + strlen(temp)];
sprintf(buf, "temp (K): %.2f\n", temp);
cli_output(buf);

cli_output:

void cli_output(u8_t buf[])
{
    for (int i = 0; i < strlen(buf); i++)
    {
        uart_poll_out(comm_uart, buf[i]);
    }
}

我的输出:Fuel gauge temp (K): 编辑:如果我有下面的代码,它会按预期打印到控制台。

int temp = 9;
u8_t buf[strlen("temp (K): %d\n") + strlen(temp)];
sprintf(buf, "temp (K): %d\n", temp);
cli_output(buf);

【问题讨论】:

  • strlen(temp) 是错误的,因为temp 不是字符串。你如何打印整数?
  • 我很惊讶这段代码没有崩溃。
  • 检查您的手册。某些嵌入式环境不支持打印浮点数。
  • @PurpleSpark 您将intfloat 传递给需要char * 的函数。实际上,这段代码甚至不应该编译。
  • u8_t buf[strlen("temp (K): %.2f\n") + strlen(temp)]; 这一行在很多层面上都是错误的。不要使用sprintf,最好使用snprintf。你在什么平台上编程?您使用的是什么编译器、编译器选项和编译器版本?如果你在一些裸机目标上编程,很可能你正在使用 newlib 而没有使用-uprintf_float(或类似的东西)。

标签: c embedded printf uart


【解决方案1】:

strlen() 用于测量字符串的长度,而不是整数或浮点数。

snprintf()函数返回要写入的字符串的长度,所以你可以用它来分配。

也不要忘记为终止空字符分配。

float temp = 9.5;
const char* message = "temp (K): %.2f\n";
int length = snprintf(NULL, 0, message, temp);
u8_t buf[length + 1];
sprintf(buf, message, temp);
cli_output(buf);

【讨论】:

  • 我试过这个,但我的程序没有超过sprintf(buf, message, temp);。我不知道为什么
  • @PurpleSpark 您使用的是什么版本的 C?试试 C99。
  • 小心,特别是对于 C 标准中的“独立环境”(嵌入式系统正常),尤其是在没有动态内存分配的情况下,“可变长度数组”(如您的 u8_t buf[length+1] )可能不会受支持并可能导致崩溃。因为数组不是在编译时确定的,而是在运行时确定的。它们的实现方式取决于实现(您的编译器)。
  • @kesselhaus 这不是通常意义上的“动态内存分配”的示例,数组将位于堆栈而不是堆中。超出可用堆栈空间是有风险的,内存碎片等则不是。
  • 虽然这篇文章没有错误,但它只处理切线错误,而不是最终问题,即提问者的嵌入式环境(通常)缺少 printf 中的浮点支持() 等
【解决方案2】:

抛开数组长度问题不谈,造成这种情况的原因是开发环境没有启用浮点 printf 支持。 Eclipse 在某些环境中有一个 UI 设置——我在 Simplicity Studio 中看到过。或者您可以手动添加链接器选项 -u _printf_float

【讨论】:

  • 是的,这就是我遇到的问题。结果我没有足够的闪存来支持它(我尝试添加并且它溢出)所以我求助于制作自己的函数来打印浮点数:)
  • 我记得它在我正在进行的 ARM (SiLabs BlueGecko) 项目中增加了大约 10-12 KB。
  • 我只有 32kb,不幸的是它几乎已经满了。无论如何感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2020-07-13
  • 2023-01-25
  • 2011-11-23
  • 1970-01-01
  • 2021-11-23
相关资源
最近更新 更多