在 C++ 中返回 2D arrray
returning a 2D arrray in c++
我最近开始用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 个问题:
- 函数的返回类型是
int
,但您尝试返回int [15][20]
- 不允许从函数返回数组
- 并非所有代码路径都返回值,
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
的当前代码中,其中xyz
是Array2D
实例的名称。
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 在C++中迭代 2D 容器的最干净方法
- 如何引用 2D 指针?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- C++动态安全 2D 交错阵列
- 如何在C++或OpenCV子矩阵中的2D子向量上使用OpenACC?
- 在 C++ 中返回 2D arrray
- 使用 2D arrray.分段错误 - C++