又是一个初级到中级的问题。我试图通过一个二维数组在c++中的函数。我知道数组不能直接发送给函数,所以我首先创建了一个指针(名称编辑,但你会得到的想法):
double input[a][b] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}};
Class.calculate (*(input), a, b);
然后我试着在说的函数中使用它-但似乎我不知道如何解引用指针,以便能够再次处理二维数组。我的代码(大致):
for (int x=0; x<=a; x++){
for (int y=0; y<=b; y++){
tmpInput[x][y]= (*input)[x][y];
}
}
编译器报错一个错误,即invalid types ‘double[int]’ for array subscript
,但我仍然不知道是什么问题。我最好的选择是我没有正确地解引用二维数组,但另一种选择是c++不能直接解引用二维数组,而是依赖于在发送数组之前将其转换为一维数组。什么好主意吗?
为什么数组不能直接发送给函数?
Call Class.calculate (*(input), a, b);
试图解引用input
,你不能这样做,因为它不是一个指针。
如果calculate
定义为:
Class::calculate(double *input[], size a, size b)
可以直接调用Class.calculate(input, a, b)
我知道数组不能直接发送给函数,所以我首先创建了一个指针(名称编辑,但你会得到的想法)
是错误的。你可以通过的。只需将calculate
成员函数的第一个参数设置为指向指针的指针。
calculate( double **ptr, int rows, int columns ){
// Now access the array via ptr as usual with the [] operator.
// like ptr[0][1]
}
并将其命名为- Class。
没人说过模板的事吗?我很失望!
你实际上可以把它作为一个真正的引用来传递,而不需要在c++中把size作为额外的参数传递:
class Class{
public:
// ...
template<unsigned N, unsigned M>
void calculate(double (&arr)[N][M]){
// use it like normal, arr[x][y]
// ...
}
// ...
};
Ideone示例
即使这不能回答你问的问题,知道这些东西总是好的。毕竟,模板是c++的重要组成部分,无论你是初学者、中级还是专业人士。您从第一天开始使用它们,尽管可能不是有意的。
如果没有看到calculate()
的声明,很难确定,但我猜这是参数类型不匹配。您可以将数组作为double*
发送,但不能作为double**
发送——它是一个双精度数组(它们在内存中线性排列,即使编译器允许您将它们视为多维数组)。但是不是一个双精度指针数组,这就是double**
类型的实际含义:取消对double**
的引用,得到double*
。
如果你知道第二个下标是常量(在你的例子中是2),你可以定义calculate()
期望一个N*2的双精度数组:
void calculate(double array[][2], int a)
{
//Whatever
}
或者,如果两个维度都可以改变,只需直接使用double*
并自己使用指针数学(在调用此方法时,您可能需要将数组强制转换为double*
,但它会工作):
void calculate(double* array, int a, int b)
{
//To get array[i][j]:
array[i * b + j];
}
希望这对你有帮助!
使用Boost。MultiArray:
http://www.boost.org/doc/libs/1_47_0/libs/multi_array/doc/user.html它们支持视图、范围、迭代器,它们抽象了内存管理,但仍然具有极高的可配置性。您可以像您期望的那样通过引用传递multi_arrays。
如果你想了解原始指针(或者你正在编写一个需要容纳64k内存的嵌入式应用程序),那么编写使用它们的代码是一个好主意。如果您想编写可维护的产品代码,那么使用STL/Boost并避免使用原始指针是一个好主意,除非在不太可能需要阅读的代码中。