【发布时间】:2018-01-09 14:31:28
【问题描述】:
我目前正在从事个人 AVR 项目,并编写了一个使用 UART 将双精度数据传输到我的串行 LCD 屏幕的函数。为此,我将 double 转换为 char 数组,然后逐个字符地串行传输它。
让我感到困惑的是 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 .
那么这里发生了什么?
【问题讨论】:
-
你能把显示的代码段here直接放到帖子里吗?在您的其他内容的上下文中会更容易看到。
-
关于 ...要打印 1234.2,我必须将缓冲区长度设置为 6。:需要包含字符串
1234.2的缓冲区需要有空间7个字符。C string是一个以 NULL 字符结尾的字符数组。 -
@ryyker 虽然我没有使用字符串,但我正在遍历一个字符数组并通过串行传输一个字符一个字符。更奇怪的是,它适用于长度为 0 的缓冲区。
-
欢迎来到未定义行为的世界
-
@ryyker "需要包含字符串 1234.2 的缓冲区需要有 7 个字符的空间",没错。但现在我更加困惑,因为我尝试了使用整数和 itoa 的相同过程函数,它是一对一的映射,例如,要显示 255,我需要缓冲区长度为 1。