0

我在 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

我该怎么做?我一直在阅读并试图弄清楚这一点超过一个小时。我不知道我做错了什么。

有用的参考页面:

  1. http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
  2. http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#ga963f816fc88a5d8479c285ed4c630229
  3. https://www.arduino.cc/en/Reference/PROGMEM
4

1 回答 1

1

MY_DATAis const byte* const, but等元素的类型DATA1被转换const byte (*)[2]为错误消息提示的类型,因此会发生类型不匹配。请注意,表达式中的数组会自动转换为指向其第一个元素的指针,但某些例外情况除外,例如一元运算符&sizeof.

使用正确的类型:const byte (*)[2]这样的指针数组:

const static byte(* const MY_DATA[])[2] PROGMEM = {DATA1, DATA2, DATA3};

这是“静态变量 MY_DATA 作为指向 const 字节数组 2 的 const 指针的数组”。

根据cdeclconst 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]用这种方法解码。

正常表达式评估:

  1. MY_DATA
  2. MY_DATA[]: 一些元素MY_DATA
  3. *MY_DATA[]: 取消引用元素
  4. (*MY_DATA[])[2]: 一些被取消引用的元素

解码类型声明(尚未解码的内容由 表示@):

  1. byte @: 有类型的东西byte
  2. byte @[2]: 2 元素数组byte
  3. byte (*@)[2]: 指向 2 元素数组的指针byte
  4. byte (*@[])[2]: 指向 2 元素数组的指针数组byte
  5. byte (*MY_DATA[])[2]: MY_DATA,它是一个指向 2 元素数组的指针数组byte
于 2016-06-19T04:24:44.580 回答