У меня есть несколько 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
Как я должен это сделать? Я читал вокруг и пытался выяснить это в течение часа. Я не знаю, что я делаю не так.
Полезные справочные страницы:
Тип элементов 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]
в этом методе.
Оценка нормального выражения:
MY_DATA
MY_DATA[]
: какой-то элемент MY_DATA
*MY_DATA[]
: разыменовать элемент(*MY_DATA[])[2]
: какой-то элемент того, что разыменованоДекодирование объявления типа (то, что еще не декодировано, представлено как @
):
byte @
: что-то, имеющее тип byte
byte @[2]
: Массив из 2 элементов byte
byte (*@)[2]
: указатель на 2-элементный массив byte
byte (*@[])[2]
: массив указателей на 2-элементный массив byte
byte (*MY_DATA[])[2]
: MY_DATA
, который является массивом указателей на 2-элементный массив byte
Других решений пока нет …