Как сделать массив PROGMEM из двухмерных массивов PROGMEM

У меня есть несколько 2D-массивов в PROGMEM.

Я хочу сохранить их в другом массиве, следовательно, имея массив PROGMEM из 2d массивов 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

0

Решение

Тип элементов 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 как массив константного указателя на массив 2 константного байта».

В соответствии с Cdecl, const char(* const MY_DATA[99])[2]; может быть декодирован как «MY_DATA как массив 99 константного указателя на массив 2 константного символа». С некоторыми изменениями вы можете получить реализацию правильного типа.

Вы можете декодировать объявление типа без 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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]