C++ 中的动态嵌套数组导致无法将大括号括起来的初始值设定项列表转换为 int
Dynamic nested arrays in C++ resulting in cannot convert brace-enclosed initializer list to int
我编写了一个函数,它接受一个动态长度数组,但内部数组大小固定,函数中的第二个参数是父数组的长度。但是,当我尝试访问嵌套值时,出现了上述问题。
void myFunc(int arrOfArr, int arrOfArrLen) {
// try to access
arrOfArr[0][1]; // expect val2
}
用法示例
myFunc(
{
{val1, val2},
{val3, val4}
},
2
);
编辑:我意识到“上下文”显然一个整数没有索引,但这就是你声明数组的方式......(如实地在 Arduino 上下文中)但显然它仍然是 C++
这是第一个沙箱 Google 返回的上面的可运行演示
更新
我确实找到了一个解决方案,它很丑但很有效:
我没有将“原始”嵌套数组作为参数传递,而是先将其设置为变量,例如:
int arrOfArr[][3] = {
{val1, val2},
{val3, val4}
}
然后在函数中我做同样的事情
void myFunc(int arrOfArr[][3], int arrOfLen) {
// access
}
调用它
myFunc(arrOfArr, 2);
正如我所说,它很难看,但对我有用,这是一个通过项目的东西,而不是低级开发人员,也许以后会完全学习它,但在日常工作中不需要。
编辑:显然是我最初尝试做的事情,例如。嵌入初始化列表作为参数不起作用。
如果要传递嵌套数组,声明可以是:
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) {
// ...
}
但是如果你传递一个brace-enclosed初始化器它就不起作用,你可以添加一个重载函数:
template<size_t M, size_t N>
void myFunc(int const (&arrOfArr)[M][N], int arrOfArrLen){
// attention: int *const*
// ...
}
我编写了一个函数,它接受一个动态长度数组,但内部数组大小固定,函数中的第二个参数是父数组的长度。但是,当我尝试访问嵌套值时,出现了上述问题。
void myFunc(int arrOfArr, int arrOfArrLen) {
// try to access
arrOfArr[0][1]; // expect val2
}
用法示例
myFunc(
{
{val1, val2},
{val3, val4}
},
2
);
编辑:我意识到“上下文”显然一个整数没有索引,但这就是你声明数组的方式......(如实地在 Arduino 上下文中)但显然它仍然是 C++
这是第一个沙箱 Google 返回的上面的可运行演示
更新
我确实找到了一个解决方案,它很丑但很有效:
我没有将“原始”嵌套数组作为参数传递,而是先将其设置为变量,例如:
int arrOfArr[][3] = {
{val1, val2},
{val3, val4}
}
然后在函数中我做同样的事情
void myFunc(int arrOfArr[][3], int arrOfLen) {
// access
}
调用它
myFunc(arrOfArr, 2);
正如我所说,它很难看,但对我有用,这是一个通过项目的东西,而不是低级开发人员,也许以后会完全学习它,但在日常工作中不需要。
编辑:显然是我最初尝试做的事情,例如。嵌入初始化列表作为参数不起作用。
如果要传递嵌套数组,声明可以是:
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) {
// ...
}
但是如果你传递一个brace-enclosed初始化器它就不起作用,你可以添加一个重载函数:
template<size_t M, size_t N>
void myFunc(int const (&arrOfArr)[M][N], int arrOfArrLen){
// attention: int *const*
// ...
}