我突然在嵌入式C ++项目(Arduino)中遇到了一个字节数组的问题。
字节在一个单独的文件中被#defined定义,该文件在别处生成,并被拉入我的项目中。然后将它们用于计算。但是在我将字节加载到数组后,前两个继续改变我。 (!)
所以在我的其他文件中:
#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 ++模块,因此我犯了错误。
答案 0 :(得分:1)
我在Arduino程序中遇到了完全相同的问题。原来是一些第三方代码在Data部分覆盖了我的数组。请参阅此处Mosquitto socket read error Arduino client了解我的调试方式。
答案 1 :(得分:0)
首先,没有像
这样的结构Serial.print(MyStuff[1], HEX);
除了正如 Jashaszun 所指出的那样,在C.中,Serial是结构的实例,print是其数据成员(函数指针)。但通常实例的名称是用小写字母书写的。所以看起来你正在使用C ++。
如果您将此调用替换为简单的printf(“%d”,MyStuff [1]),您将获得正确的值。
所以问题出在这个由print
Serial.print(MyStuff[1], HEX);
这是一个示范代码
#include <stdio.h>
#include <stdint.h>
#define MY_BYTES 0x26,0x28,0X1B,0X52,0X07,0X62,0X62
int main(void)
{
uint8_t a[] = {MY_BYTES};
int i;
for ( i = 0; i < sizeof( a ) / sizeof( *a ); i++ ) printf( "%d ", a[i] );
puts( "" );
return 0;
}
输出
38 40 27 82 7 98 98