使用双指针传递二维常量数组

时间:2018-10-15 05:55:59

标签: c++ arrays multidimensional-array const

我想使用双指针传递2D const数组,但出现编译器错误。

const unsigned char sizex=2;
const unsigned char sizey=5;
const unsigned char arr[sizex][sizey] ={
  {1,2,3,4,5},
  {6,7,8,9,10}};

void foo (const unsigned char **a, const unsigned char x, const unsigned char y) {
  int i,j;
  for(i=0;i<x;i++) {
    for(j=0;j<y;j++) {
      Serial.println(a[i][j]);
    }
  }
}

void main() {
  foo(arr,sizex,sizey);
}

错误

  

无法将'const unsigned char(*)[5]'转换为'const unsigned char **'   对于参数'1'到'void foo(const unsigned char **,unsigned char,   未签名的字符)'

void foo (const unsigned char a,[][5] const unsigned char x, const unsigned char y)有效,但是我不想将[5]硬编码到代码中。

有什么建议可以解决此问题吗?

1 个答案:

答案 0 :(得分:2)

在C语言中,一种解决方案是使用variable-length arrays,这可以通过切换参数的顺序来完成:

void foo (const unsigned char x, const unsigned char y, const unsigned char a[x][y]) { ... }

但是,这是有问题的,因为Arduino实际上是使用C ++而不是C编程的,并且C ++没有可变长度数组(即使某些编译器可能已将其添加为扩展)。

当然,您可以直接使用全局常量(和数组),而不用作为参数传递,除非您需要对不同大小的不同数组使用相同的函数。可与C和C ++一起使用。请注意,应尽可能避免使用全局变量。

解决问题的自然C ++解决方案是使用std::vector,但是我不知道有多少可用的C ++标准库。您可能应该研究the Arduino documentation,看看是否还有其他可用的容器类型。