gpt4 book ai didi

对 dtostrf 函数感到困惑

转载 作者:太空宇宙 更新时间:2023-11-04 07:58:53 24 4
gpt4 key购买 nike

我目前正在从事一个个人 AVR 项目,并编写了一个函数,用于使用 UART 将 double 传输到我的串行 LCD 屏幕。为此,我将 double 转换为 char 数组,然后逐个字符地串行传输它。

令我困惑的是字符缓冲区数组的长度必须是多少。数组的长度似乎与 double 的大小不对应。有趣的是,我可以将数组的长度设置为 0,它仍然有效,如下所示:

    void USART_Transmit_Double(double doubleNumber) {

char aNumberAsString[0];
dtostrf(doubleNumber, 3, 0, aNumberAsString);

USART_Transmit_String(aNumberAsString);
}

在这里,我在主循环中打印数字 1234,它在我的 LCD 上显示得很好。但是,如果我将精度更改为 1,整个事情就会变得一团糟。

我在我的 Arduino 上测试了相同的函数,并不断得到完全不同的结果,在它上面每个字符似乎对应于数组的每个元素,所以如果我想打印 1234.2,我必须将缓冲区长度设置为 6 .

那么这里发生了什么?

最佳答案

您正在遇到 undefined behavior 。特别是,在此链接中,短语:Examples of undefined behavior are memory accesses outside of array bounds,... 可能适用于您描述的场景。如果您尝试访问(但不拥有)的内存没有碰巧违反另一个变量的内存空间,它可能会工作一千次。第一次这样做时,您的程序会崩溃。

以下语句虽然合法,但会创建一个无用的变量,这可能是您看到奇怪结果的原因:

char aNumberAsString[0];

处理您的评论:
您可能会混淆创建包含单个值的缓冲区所需的索引值与创建变量后访问该值所需的索引值。即

char aNumberAsString[1] = 'A'; //creates an array of 1 char ([1])

将创建一个可以包含单个 char 值的变量。

char value = aNumberAsString[0]; // accesses the only value in array ([0])

示例:
查看如何使用 dtostrf 函数的示例 here .
请注意此示例使用的变量的大小:

static float f_val = 123.6794;
static char outstr[15];

支持以下调用:

 dtostrf(f_val,7, 3, outstr);

产生以下输出:

123.679

关于对 dtostrf 函数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48170408/

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