我想使用双指针传递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]硬编码到代码中。
有什么建议可以解决此问题吗?
答案 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,看看是否还有其他可用的容器类型。