如何在c++中发送一个二维数组作为引用,并返回



又是一个初级到中级的问题。我试图通过一个二维数组在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并避免使用原始指针是一个好主意,除非在不太可能需要阅读的代码中。

相关内容

  • 没有找到相关文章

最新更新