我突然对嵌入式C ++项目(Arduino)中的字节数组感到麻烦。
字节是在另一个文件中定义的,该文件在其他位置生成,并拉入我的项目。然后将它们用于计算。但是在我将字节加载到数组中之后,前两个继续对我进行更改。 (!)
所以在另一个文件中,我有:
#define MY_BYTES 0x26,0x28,0X1B,0X52,0X07,0X62,0X62
在一个文件中,然后在另一个文件中,我将它们用于:
#define ARRAY_SZ 7
void doMyStuff() {
uint8_t MyStuff[ARRAY_SZ] = { MY_BYTES };
Serial.print(" The 1st bytes: ");
Serial.print(MyStuff[0], HEX);
Serial.print(", ");
Serial.print(MyStuff[1], HEX);
Serial.print(", ");
Serial.println(MyStuff[2], HEX);
etc...
}
当它运行时,我得到
The 1st bytes: 36, 0, 1B
如果我在声明后进行干预并坚持执行某些直接任务,则可以使用以下命令覆盖它们:
MyStuff[0] = 0x26;
MyStuff[1] = 0x28;
...,然后前两个是正确的,就像其余的一样(实际上有20个字节,为简洁起见,我将其缩小了)。但是我不知道为什么声明中的分配失败。
我将所有内容移到同一文件中,丢失了#define,并使用以下代码对其进行了初始化:
uint8_t MyStuff[] = {0x26,0x28,0x1B,0x52,0x07,0x62};
仍然是问题。我是否缺少有关C ++中数组的信息?如果没有直接分配,我只是无法确保前两个字节正确。我的内存似乎并不低,在分配和回读之间没有其他操作发生,因此我认为该内存上没有其他问题。
可能我在这里想念的东西很明显吗?
编辑:正如指出的那样,这是在Arduino环境中,它是C ++的子集(更改了我的标题)。我正在研究的项目混合使用C和C ++模块,因此是我的错误。
最佳答案
我在Arduino程序中遇到了完全相同的问题。原来是一些第三方代码覆盖了“数据”部分中的数组。有关如何调试它的信息,请参见Mosquitto socket read error Arduino client。