【问题标题】:C++/Arduino Passing pointer to 2D array stored in PROGMEMC++/Arduino 将指针传递给存储在 PROGMEM 中的二维数组
【发布时间】:2015-02-21 12:40:51
【问题描述】:

我有几个 const int 二维数组全局存储在 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(),并且在我使用的主体函数中:

pgm_read_byte(&image1[i][j])

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

【问题讨论】:

  • 它现在如何工作?当你构建你的程序时会发生什么?当你运行你的程序时会发生什么?请详细说明!
  • 我编辑了我的问题,请看一下!感谢您的宝贵时间

标签: c++ arrays pointers 2d progmem


【解决方案1】:

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

pgm_read_byte(&image[i][j])

pgm_read_byte(image[i] + j)

但是,请注意,在 int 的数组上使用 pgm_read_byte 是不常见的(在 AVR 上是 2 个字节宽)。您可能应该将image1 设为uint8_t 的二维数组或使用pgm_read_word

【讨论】:

  • 使用 uint8_t 而不是 int 确实会减小大小,感谢您的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2014-12-31
  • 1970-01-01
  • 2016-04-27
  • 2014-05-09
  • 2018-12-08
相关资源
最近更新 更多