C ++ - 从函数返回多维数组

时间:2014-06-02 20:01:00

标签: c++ function multidimensional-array

我正在为Cellular Automata编写代码,我需要一个演化函数来计算一段时间后自动机的状态。 我选择调用这个函数evol,测试它我在C ++中创建了一个基本函数。不幸的是它没有编译,因为编译器无法理解我需要它来返回一个数组。这是代码:

#include <iostream>
#include <cmath>
#include <vector>
#include <string>

using namespace std;

const int N = 51; // Size of the grid; two columns/rows are added at the beginning and the end of the array (no evolution of the CA on the boundaries)

class Cell{
    //defining whats a cell here        
};

void showCA(Cell CA[N+2][N+2]){
    //function to print the CA grid in the terminal         
}


Cell[N+2][N+2] evol(Cell CA[N+2][N+2]){
    return CA;
}

int main()
{
     // Initialisation
    cout << "Initialisation" << endl;
    static Cell CA[N+2][N+2];
    // some code here to initialize properly the Cell array.
    showCA(CA);
    CA = evol(CA);
    showCA(CA);
    return 0;
} 

编译器返回此错误:

error: expected unqualified-id
Cell[N+2][N+2] evol(Cell CA[N+2][N+2]){

关于如何实现这一点的任何想法?

5 个答案:

答案 0 :(得分:3)

您无法从函数返回数组:

  

§8.3.5/ 8

     

函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针的返回类型或对此类事物的引用。

如果您希望从函数返回原始C样式数组,则必须使用引用或指针。例如,以下是使用引用完成的方法(您可以使用&代替*使用指针执行相同操作):

Cell (&evol(Cell (&CA)[N+2][N+2]))[N+2][N+2];

然而,这非常不直观且难以阅读。如果您的编译器支持最新标准(C ++ 11),则可以使用尾随返回类型清除返回类型:

auto evol(Cell (&CA)[N+2][N+2]) -> Cell(&)[N+2][N+2];

但同样,这可能仍然难以阅读。


C ++ 11有助于使用容器std::array<>处理C样式数组。非C ++ 11代码应使用std::vector<>

using Cells = std::array<std::array<Cell, N+2>, N+2>;

Cells const& evol(Cells const& CA);

答案 1 :(得分:0)

您可以使用

typedef std::vector<std::vector<Cell>> CellArray;
CellArray Cells(N+2);  // resize main dimension
for (size_t i=0; i<N+2; i++)
    Cells[i].resize(N+2); // resize all cells of main dimension

保存您的单元格数组,但您还需要在Cell类

中添加复制构造函数和operator =
class Cell {
public:
    Cell() { ... default ctor code here ... }
    Cell(const Cell &c) { *this = c; }

    Cell &operator=(const Cell&c)
    {
        if (this != &c)
        {
            ... copy data from c members to this members here ...
        }
        return *this;
    }
};

然后你的evol函数可以返回一个CellArray:

CellArray evol(CellArray &c)
{
   CellArray r;
   ... do some calculations with c and r ...
   return r;
}

答案 2 :(得分:0)

一旦使用数组语法声明变量,就像你有:

Cell CA[N+2][N+2];

您不能将CA指定为其他内容。您只能为其内容分配值。因此,

CA = evol(CA);

错了。

您可以执行以下操作:

Cell (*CA2)[N+2] = evol(CA);

答案 3 :(得分:0)

由于元素的数量似乎已修复,我建议您使用std::array容器:

const int N = 51;
typedef std::array<std::array<Cell,N+2>, N+2> datatype;

然后,您可以将此类型用作返回类型:

datatype Evol( const datatype& d );

您可以访问元素,就像它是&#34; C&#34;阵列:

datatype d;
Cell c;
d[10][20] = c;

答案 4 :(得分:0)

我强烈建议将数组封装到类中。您不能返回数组,但可以返回包含数组的对象。