如何制作2D PROGMEM数组的PROGMEM数组

时间:2016-06-19 03:48:20

标签: c++ arrays pointers arduino progmem

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

我该怎么做?我一直在四处阅读并试图解决这个问题。我不知道自己做错了什么。

有用的参考页:

  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

1 个答案:

答案 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的数组”。

根据cdeclconst char(* const MY_DATA[99])[2];可以解码为“MY_DATA作为const指针的数组99指向const char的数组2”。通过一些修改,您可以获得正确类型的实现。

您可以按正常表达式评估的颠倒顺序解码不带const的类型声明。 (对不起,目前我不擅长解码限定词)让我在这个方法中解码byte(*MY_DATA[])[2]

正常表达评估:

  1. MY_DATA
  2. MY_DATA[]MY_DATA
  3. 的某些元素
  4. *MY_DATA[]:取消引用元素
  5. (*MY_DATA[])[2]:取消引用的一些元素
  6. 解码类型声明(尚未解码的内容由@表示):

    1. byte @:类型为byte
    2. 的内容
    3. byte @[2]byte
    4. 的2元素数组
    5. byte (*@)[2]:指向byte
    6. 的2元素数组的指针
    7. byte (*@[])[2]:指向byte
    8. 的2元素数组的指针数组
    9. byte (*MY_DATA[])[2]MY_DATA,这是指向byte
    10. 的双元素数组的指针数组