C ++字节数组初始化 - 错误是什么?

时间:2014-08-14 22:05:50

标签: c arrays arduino

我突然在嵌入式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 ++模块,因此我犯了错误。

2 个答案:

答案 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