我正在为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]){
关于如何实现这一点的任何想法?
答案 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)
我强烈建议将数组封装到类中。您不能返回数组,但可以返回包含数组的对象。