gpt4 book ai didi

c - 在嵌入式 C 中将 float 与 sprintf() 一起使用

转载 作者:太空狗 更新时间:2023-10-29 16:24:02 25 4
gpt4 key购买 nike

伙计们,我想知道 float 变量是否可以在 sprintf() 函数中使用。

比如,如果我们写:

sprintf(str,"adc_read = %d \n",adc_read);

其中adc_read是一个整数变量,它将存储字符串

"adc_read = 1023 \n"

str 中(假设 adc_read = 1023)

如何使用浮点变量代替整数?

最佳答案

由于您在嵌入式平台上,您很可能无法获得 printf() 样式函数的全部功能。

假设你有 float (对于嵌入的东西仍然不一定是给定的),你可以用类似的东西来模拟它:

char str[100];
float adc_read = 678.0123;

char *tmpSign = (adc_read < 0) ? "-" : "";
float tmpVal = (adc_read < 0) ? -adc_read : adc_read;

int tmpInt1 = tmpVal; // Get the integer (678).
float tmpFrac = tmpVal - tmpInt1; // Get fraction (0.0123).
int tmpInt2 = trunc(tmpFrac * 10000); // Turn into integer (123).

// Print as parts, note that you need 0-padding for fractional bit.

sprintf (str, "adc_read = %s%d.%04d\n", tmpSign, tmpInt1, tmpInt2);

您需要根据整数的大小限制小数点后的字符数。例如,对于 16 位有符号整数,您只能使用四位数字(9,999 是可以表示的最大的 10 减 1 次方)。

但是,有一些方法可以通过进一步处理小数部分来处理此问题,每次将其移动四位小数(并使用/减去整数部分),直到您获得所需的精度。


更新:

最后一点,您提到您在对其他答案之一的回应中使用了 avr-gcc。我发现以下网页似乎描述了在 printf() 语句中使用 %f 需要做什么 here .

正如我最初怀疑的那样,您需要做一些额外的工作才能获得浮点支持。这是因为嵌入的东西很少需要 float (至少我做过的东西都不需要)。它涉及在您的 makefile 中设置额外参数并链接额外的库。

但是,由于需要处理一般输出格式,这可能会大大增加您的代码大小。如果您可以将 float 输出限制在小数点后 4 位或更少,我建议将我的代码转换为一个函数并直接使用它 - 它可能会占用更少的空间。

万一该链接消失了,您需要做的是确保您的 gcc 命令具有 "-Wl,-u,vfprintf -lprintf_flt -lm"。这转化为:

  • 强制 vfprintf 最初未定义(以便链接器必须解析它)。
  • 指定用于搜索的浮点printf()库。
  • 指定用于搜索的数学库。

关于c - 在嵌入式 C 中将 float 与 sprintf() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/905928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com