#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])
и позволить компилятору обрабатывать вычисления смещения.