C++/Arduino将指针传递到存储在PROGMEM中的2D数组

C++/Arduino Passing pointer to 2D array stored in PROGMEM

本文关键字:存储 PROGMEM 中的 数组 2D Arduino 指针 C++      更新时间:2023-10-16

我有几个const int 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])
}

我对指针等的使用不太熟悉,但我知道这就是方法。你能告诉我如何使它工作吗?

第1版:我现在是怎么做的(它有效,但并不优雅);我有一个没有任何参数的函数printImage1(),在body函数中我使用:

pgm_read_byte(&image1[i][j])

以读出图像1。对于image2、image3等,我复制函数printImage1,并将imgage1从上面更改为image2、image 3等。这是多余的编程,这就是为什么我只想使用一个函数printImage在argument中指定图像。

pgm_read_byte获取要读取的字节的地址。你可以使用

pgm_read_byte(&image[i][j])

pgm_read_byte(image[i] + j)

然而,请注意,在int的数组上使用pgm_read_byte是不寻常的(在AVR上为2字节宽)。您可能应该将image1设为uint8_t的2D阵列,或者使用pgm_read_word