如何制作二维 PROGMEM 阵列的 PROGMEM 阵列
How to make PROGMEM array of 2D PROGMEM arrays
我在 PROGMEM 中有几个二维数组。
我想将它们存储到另一个数组中,因此有一个 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
我该怎么做?一个多小时以来,我一直在四处阅读并试图弄清楚这一点。我不知道我做错了什么。
有用的参考页面:
MY_DATA
的元素类型是const byte* const
,但是DATA1
等按照错误提示被转换为const byte (*)[2]
,所以类型不匹配。请注意,表达式中的数组会自动转换为指向其第一个元素的指针,但某些例外情况除外,例如一元运算符 &
或 sizeof
.
使用正确的类型:指向 const byte (*)[2]
的指针数组,如下所示:
const static byte(* const MY_DATA[])[2] PROGMEM = {DATA1, DATA2, DATA3};
这是"static variable MY_DATA as array of const pointer to array 2 of const byte"。
根据cdecl,const char(* const MY_DATA[99])[2];
可以解码为"MY_DATA as array 99 of const pointer to array 2 of const char"。通过一些修改,您可以获得正确类型的实现。
您可以在没有 const
的情况下以与正常表达式评估相反的顺序解码类型声明。 (对不起,目前我不擅长解码限定符)让我用这种方法解码byte(*MY_DATA[])[2]
。
普通表达式求值:
MY_DATA
MY_DATA[]
: MY_DATA
的一些元素
*MY_DATA[]
: 取消引用元素
(*MY_DATA[])[2]
: 取消引用的某些元素
解码类型声明(尚未解码的内容用@
表示):
byte @
: 类型为 byte
的东西
byte @[2]
:byte
的 2 元素数组
byte (*@)[2]
:指向 byte
的 2 元素数组的指针
byte (*@[])[2]
:指向 byte
的 2 元素数组的指针数组
byte (*MY_DATA[])[2]
: MY_DATA
,这是指向 byte
的 2 元素数组的指针数组
我在 PROGMEM 中有几个二维数组。
我想将它们存储到另一个数组中,因此有一个 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
我该怎么做?一个多小时以来,我一直在四处阅读并试图弄清楚这一点。我不知道我做错了什么。
有用的参考页面:
MY_DATA
的元素类型是const byte* const
,但是DATA1
等按照错误提示被转换为const byte (*)[2]
,所以类型不匹配。请注意,表达式中的数组会自动转换为指向其第一个元素的指针,但某些例外情况除外,例如一元运算符 &
或 sizeof
.
使用正确的类型:指向 const byte (*)[2]
的指针数组,如下所示:
const static byte(* const MY_DATA[])[2] PROGMEM = {DATA1, DATA2, DATA3};
这是"static variable MY_DATA as array of const pointer to array 2 of const byte"。
根据cdecl,const char(* const MY_DATA[99])[2];
可以解码为"MY_DATA as array 99 of const pointer to array 2 of const char"。通过一些修改,您可以获得正确类型的实现。
您可以在没有 const
的情况下以与正常表达式评估相反的顺序解码类型声明。 (对不起,目前我不擅长解码限定符)让我用这种方法解码byte(*MY_DATA[])[2]
。
普通表达式求值:
MY_DATA
MY_DATA[]
:MY_DATA
的一些元素
*MY_DATA[]
: 取消引用元素(*MY_DATA[])[2]
: 取消引用的某些元素
解码类型声明(尚未解码的内容用@
表示):
byte @
: 类型为byte
的东西
byte @[2]
:byte
的 2 元素数组
byte (*@)[2]
:指向byte
的 2 元素数组的指针
byte (*@[])[2]
:指向byte
的 2 元素数组的指针数组
byte (*MY_DATA[])[2]
:MY_DATA
,这是指向byte
的 2 元素数组的指针数组