C ++ / Arduino Передача указателя на двумерный массив, хранящийся в PROGMEM

У меня есть несколько константных 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.

0

Решение

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,

0

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


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