我在PROGMEM中有几个2D数组。
我想将它们存储到另一个数组中,因此具有2d PROGMEM数组的PROGMEM数组。
然后我想读出数据。
这是我拥有的
void myFunc()
{
const static byte DATA1[3][2] PROGMEM =
{
-1, 6,
-3, 6,
-5, 5
};
const static byte DATA2[3][2] PROGMEM =
{
1, 0,
1, 0,
1, 0
};
const static byte DATA3[6][2] PROGMEM =
{
0, 1,
1, 3,
2, 4,
4, 4,
6, 3,
7, 1
};
//PROGMEM array of 2d arrays in PROGMEM
const static byte* const MY_DATA[] PROGMEM = {DATA1, DATA2, DATA3};
//read out the data now:
byte myData = pgm_read_byte(&((MY_DATA[arrayNum])[x][y]));
//use the data here, etc, etc...
}
我的错误是:
error: cannot convert 'const byte (*)[2] {aka const
unsigned char (*)[2]}' to 'const byte* const {aka const
unsigned char* const}' in initialization
我该怎么做?我一直在四处阅读并试图解决这个问题。我不知道自己做错了什么。
有用的参考页:
答案 0 :(得分:1)
MY_DATA
的元素类型为const byte* const
,但DATA1
等转换为const byte (*)[2]
,如错误消息所示,因此类型不匹配发生。请注意,表达式中的数组会自动转换为指向其第一个元素的指针,除了一些例外,例如一元&
或sizeof
的运算符。
使用正确的类型:指向const byte (*)[2]
的指针数组,如下所示:
const static byte(* const MY_DATA[])[2] PROGMEM = {DATA1, DATA2, DATA3};
这是“静态变量MY_DATA as const指向const字节数组2的数组”。
根据cdecl,const char(* const MY_DATA[99])[2];
可以解码为“MY_DATA作为const指针的数组99指向const char的数组2”。通过一些修改,您可以获得正确类型的实现。
您可以按正常表达式评估的颠倒顺序解码不带const
的类型声明。 (对不起,目前我不擅长解码限定词)让我在这个方法中解码byte(*MY_DATA[])[2]
。
正常表达评估:
MY_DATA
MY_DATA[]
:MY_DATA
*MY_DATA[]
:取消引用元素(*MY_DATA[])[2]
:取消引用的一些元素解码类型声明(尚未解码的内容由@
表示):
byte @
:类型为byte
byte @[2]
:byte
byte (*@)[2]
:指向byte
byte (*@[])[2]
:指向byte
byte (*MY_DATA[])[2]
:MY_DATA
,这是指向byte