Как мне прочитать значения uint32_t из вложенного массива PROGMEM?

#c #arduino

#c #arduino

Вопрос:

У меня есть массив из 16×16 матриц значений uint32_t: const uint32_t sprites[][16][16] PROGMEM = { ... }; Я пытаюсь считывать значения с помощью pgm_read_dword(sprites (submode * 256 row * 16 column) * sizeof(uint32_t)) , но меня смущает, как работает математика адресов. В этом случае submode отображаются на индекс матрицы. submode , row и column все объявлены как uint8_t , на случай, если это вообще поможет.

Как мне правильно вычислить адрес для pgm_read_dword ?

pgm_read_dword Вообще, как я хочу попытаться прочитать uint32_t значения? Я немедленно передаю выходные данные методу, который ожидает этот тип.

Комментарии:

1. Почему бы просто не sprites[submode][row][column] ?

2. » запутался в том, как работает математика адресов » — Массивы в C хранятся в порядке следования строк .

3. pgm_read_dword(amp;sprites[submode][row][column]); второму чуваку

4. @datafiddler Вау. Это было оно!? Из-за всех примеров PROGMEM это казалось намного сложнее, например, я не мог просто ссылаться на элемент, а затем разыменовывать. Если вы не возражаете превратить это в полный ответ, я могу пометить его как принятый.

5. Я только что добавил несколько символов к комментариям чувака. Здесь приветствуется ответ на ваш собственный вопрос. Вы не уточнили сам вопрос 🙂

Ответ №1:

Согласно datafiddler в комментариях, это так же просто, как просто вызвать pgm_read_dword(amp;sprites[submode][row][column]) и позволить компилятору обрабатывать вычисления смещения.