在 C++ 中返回 2D arrray

returning a 2D arrray in c++

本文关键字:2D arrray 返回 C++      更新时间:2023-10-16

我最近开始用C++编码,我似乎不明白如何转动 2d 数组

网格阵列

问题是方法类型的某个地方,因为我似乎无法解决它。任何帮助将不胜感激!

static int GridArray [15][20];
int MapEditor::updateGrid(int *xCursor,int *yCursor){`
int width=16;
if(input.getInput()==psxUp){
VGA.drawRect((*xCursor)*16,(*yCursor)*16,(*xCursor)*16+width,(*yCursor)*16+width,255 );
(*yCursor)--;
if((*yCursor)<=0){
(*yCursor)=15;
}
VGA.drawRect((*xCursor)*16,(*yCursor)*16,(*xCursor)*16+width,(*yCursor)*16+width,224 );
}
if(input.getInput()==psxLeft){
VGA.drawRect((*xCursor)*16,(*yCursor)*16,(*xCursor)*16+width,(*yCursor)*16+width,255 );
(*xCursor)--;
if((*xCursor)<=0){
(*xCursor)=20;
}
VGA.drawRect((*xCursor)*16,(*yCursor)*16,(*xCursor)*16+width,(*yCursor)*16+width,224 );
}
if(input.getInput()==psxRight){
VGA.drawRect((*xCursor)*16,(*yCursor)*16,(*xCursor)*16+width,(*yCursor)*16+width,255 );
(*xCursor)++;
if((*xCursor)>=20){
(*xCursor)=0;
}
VGA.drawRect((*xCursor)*16,(*yCursor)*16,(*xCursor)*16+width,(*yCursor)*16+width,224 );
}
if(input.getInput()==psxDown){
VGA.drawRect((*xCursor)*16,(*yCursor)*16,(*xCursor)*16+width,(*yCursor)*16+width,255 );
(*yCursor)++;
if((*yCursor)>=15){
(*yCursor)=0;
}
VGA.drawRect((*xCursor)*16,(*yCursor)*16,(*xCursor)*16+width,(*yCursor)*16+width,224 );
}
if(input.getInput()==psxSqu){
spriteSelector.setSprite(bricks_destructive,bricks_destructive_palette);
spriteSelector.drawAtPosition((*xCursor)*16,(*yCursor)*16);
spriteSelector.update();
GridArray[(*yCursor)][(*xCursor)]=1;
Serial.println(GridArray[(*yCursor)][(*xCursor)]);
}
delay(120);
if(input.getInput()==psxSlct){
Serial.println(GridArray);
return GridArray;
}
}

在C++中,您无法返回纯数组(既不是 1D 数组,也不是 2D 数组或更高数组)。可以返回对此类数组的引用,甚至可以将此类数组封装在struct-object 中(然后可以返回)。 但是,这些解决方案可能是实际意图的解决方法。

当你开始编码C++你可能会从放弃"老式的C风格"开始,并利用标准库及其容器等C++概念,例如使用std::array。有了这个,你上面的代码示例不同:

#include <array>
typedef std::array<std::array<int,15>,20> GridArray;
GridArray initGrid() {
GridArray ga = { { 0 } };
ga[0][0] = 15;
ga[0][1] = 30;
return ga;
}
int main() {
GridArray g = initGrid();
for(auto row : g) {
for (auto column : row) {
cout << column << " ";
}
cout << endl;
}
}

请注意,还有其他变体(例如,将数组作为输入参数传递给函数,然后更改它们,而不是在函数中创建并返回它们。但实际上我认为std::array方法最接近您的需求。

我假设你遇到了编译错误? 您有 2 个问题:

  1. 函数的返回类型是int,但您尝试返回int [15][20]
  2. 不允许从函数返回数组
  3. 并非所有代码路径都返回值,return GridArray需要在 if 语句之外。

你可能想要这样的东西:

typedef int ArrayType[15][20];
static ArrayType GridArray;
ArrayType& f()
{
...
return GridArray;
}

或者更好地使用 std::vector 或 std::array

这是另一种解决方案,对于更多"技术"解决方案,它被忽略了,但这个解决方案相当简单。

此解决方案不需要对指针或引用有深入的了解,不需要 STL 的知识或使用,不需要标准C++中存在的功能或库,而这些功能或库在某些平台上可能不存在,应该非常轻量级,即使是初学者C++程序员也应该很容易理解。 但是,您需要更改一些代码才能应用此技术。

解决方案是这样的:只需将二维数组包装在struct内,然后传递/返回struct。 就是这样。

由于struct是可复制和可分配的(数组都不是),因此只需将数组包装在结构中并将其用作穷人的容器(即使它只是工作)。 复制工作、分配工作、传递到函数和从函数工作等。

struct Array2D
{
int GridArray [15][20];
};

然后你只需通过并返回周围的Array2D。 不需要指针。

static Array2D theGrid;
Array2D& SomeFunction()
{
...
theGrid.GridArray[(*yCursor)][(*xCursor)]=1;
return theGrid;
}

上面返回对声明为静态Array2D的引用。 但您也可以选择返回结果的副本,这是非常需要的。

Array2D SomeFunction2()
{
...
theGrid.GridArray[(*yCursor)][(*xCursor)]=1;
return theGrid;
}

上面采用声明的static Array2D并返回它的副本。

然后,您可以执行以下操作:

Array2D tempGrid = theGrid;   // get a copy of the original
//..
tempGrid.GridArray[0][0] = 1; // changes the copy but not the original   

无需for循环或memcpy即可将一个数组分配给另一个数组 - 让struct自动轻松地为您完成这项工作,因为赋值和复制内置了结构和类。

但同样请注意,您需要更改一些代码以将xyz.附加到引用GridArray的当前代码中,其中xyzArray2D实例的名称。