在c ++中返回2D arrray

时间:2018-03-17 20:14:47

标签: c++

我最近开始使用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;
    }
}

3 个答案:

答案 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)

我假设您收到编译错误? 你有两个问题:

  1. 您的函数的返回类型为int,但您尝试返回int [15][20]
  2. 不允许从函数
  3. 返回数组
  4. 并非所有代码路径都返回一个值,您的return GridArray需要在if语句之外。
  5. 你可能想要这样的东西:

    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}的名称实例。