首页 > 解决方案 > C ++中的动态嵌套数组导致无法将大括号括起来的初始化列表转换为int

问题描述

我写了一个函数,它接受一个动态长度数组但内部数组大小固定,函数中的第二个参数是父数组的长度。但是,当我尝试访问嵌套值时,我遇到了上面提到的问题。

void myFunc(int arrOfArr, int arrOfArrLen) {
  // try to access
  arrOfArr[0][1]; // expect val2
}

示例用法

myFunc(
  {
    {val1, val2},
    {val3, val4}
  },
  2
);

编辑:我意识到“上下文”显然一个整数没有索引,但这就是你声明一个数组的方式......(在Arduino上下文中确实如此)但显然它仍然是C++

这是 Google 返回的第一个沙箱中的上述可运行演示

http://cpp.sh/5sp3o

更新

我确实找到了一个解决方案,它很丑但它有效:

我没有将“原始”嵌套数组作为参数传递,而是首先将其设置为变量,例如:

int arrOfArr[][3] = {
  {val1, val2},
  {val3, val4}
}

然后在函数中我做同样的事情

void myFunc(int arrOfArr[][3], int arrOfLen) {
  // access
}

叫它

myFunc(arrOfArr, 2);

正如我所说,它很丑但对我有用,这是一个传递项目的东西,而不是低级开发,也许以后会完全学习它,但在日常工作中不需要。

编辑:显然我最初试图做的事情,例如。嵌入初始化列表作为参数不起作用。

标签: c++arduino

解决方案


如果你想传递一个嵌套数组,声明可能是:

template<size_t N>
void myFunc(int const arrOfArr[][N], int arrOfArrLen) {
  // ...
}

如果N已经决定,您可以删除模板参数。

const size_t N = 3;
void myFunc(int const arrOfArr[][N], int arrOfArrLen) {
  // ...
}

但是如果你传递一个大括号括起来的初始化器它不起作用,你可以添加一个重载函数:

template<size_t M, size_t N>
void myFunc(int const (&arrOfArr)[M][N], int arrOfArrLen){
  // attention: int *const*
  // ...
}

推荐阅读