我最近开始使用C ++进行编码,我似乎无法理解如何对二维数组进行反应
GridArray
问题是在方法类型的某处,因为我似乎无法解决它。任何帮助都会非常有用!
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;
}
}
答案 0 :(得分:2)
在C ++中,您不能返回普通数组(既不是1D也不是2D或更高)。可以返回对这样一个数组的引用,甚至可以将这些数组封装在struct
- 对象中(然后可以返回)。
但是,这些解决方案可能是实际意图的解决方案。
当你开始编写C ++时,你可能会开始放弃旧式的C风格&#34;并利用标准库及其容器等C ++概念,例如:与std::array
。有了这个,你就是&#39;以上代码的代码不同:
#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
- 方法最接近那就是你所需要的。
答案 1 :(得分:1)
我假设您收到编译错误? 你有两个问题:
int
,但您尝试返回int
[15][20]
return GridArray
需要在if语句之外。typedef int ArrayType[15][20];
static ArrayType GridArray;
ArrayType& f()
{
...
return GridArray;
}
甚至更好地使用std :: vector或std :: array
答案 2 :(得分:1)
这是另一种解决方案,它被忽略了更多&#34;技术&#34;解决方案,但这个解决方案相当简单。
此解决方案不需要对指针或引用的深入了解,不需要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;
}
以上内容返回对声明为static的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
自动轻松地为您执行此操作copy是内置的结构和类。
但请再次注意,您需要更改一些代码才能将xyz.
附加到引用GridArray
的当前代码,其中xyz
是{{1}的名称实例。