У меня есть несколько константных 2D-массивов, хранящихся в глобальном масштабе в PROGMEM. например:
const int image1[][17]PROGMEM = {
{1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
{1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,0},
{1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0},
{1,1,1,0,0,0,1,1,1,0,0,1,1,1,1,0,0}
}
Я хотел бы зачитать этот массив двумерных изображений в функции. Какое изображение нужно прочитать, следует указать в аргументе.
void printImage(image)
{
// do something with element i,j of image
pgm_read_byte(image[i][j])
}
Я не очень опытен с использованием указателей и т. Д., Но я знаю, что это способ сделать это. Можете ли вы показать мне, как заставить это работать?
EDIT1:
Как я это делаю сейчас (работает, но не элегантно); У меня есть функция printImage1 () без каких-либо аргументов, и в функции тела я использую:
pgm_read_byte(&image1[i][j])
зачитать изображение1.
Для image2, image3 и т. Д. Я копирую функцию printImage1 и изменяю imgage1 сверху на image2, image3 и т. Д. Это избыточное программирование, поэтому я хочу указать изображение в аргументе, используя только одну функцию printImage.
pgm_read_byte
принимает адрес байта, который вы хотите прочитать. Вы могли бы использовать
pgm_read_byte(&image[i][j])
или же
pgm_read_byte(image[i] + j)
Обратите внимание, однако, что это необычно для использования pgm_read_byte
на массиве int
(которые имеют 2 байта в AVR). Вы, вероятно, должны сделать image1
2D массив uint8_t
или использовать pgm_read_word
,