局部变量超出范围......我想

时间:2017-05-03 23:30:29

标签: c++ variables struct syntax scope

我遇到以下代码的问题。除XCoordYCoord变量外,我的一切工作正常。在ChangePosition方法中,如果XCoord不等于50,我想向其添加25,然后将XCoord重置为0,如果YCoord则将{25}添加到XCoord = 50 }和YCoord isnt equal to 50

我通过调试发现,当ChangePosition方法返回XCoordYCoord时,当调试器继续0时,它们会恢复为switch 1}}陈述。我认为这与XCoordYCoord超出范围(不是100%确定是否存在实际问题)有关,return XCoord, YCoord语法是否合法?我正在使用Visual Studio,并没有说错了,但我只是不确定。

我认为这必然是变量不变的上述两个原因之一。 我尝试使用Coords coords;方法中的2个变量初始化结构LoadLevel并将结构传递给ChangePosition方法但是我必须将变量声明为静态整数然后导致LNK2001错误:我认为这与尝试使用Coords::XCoord += 25调整变量有关。但我无法使用coords.XCoord,因为结构未在ChangePosition方法中声明,因此我收到有关未识别的类型名称的错误(沿着这些行的某些内容)。

void TileMap::LoadLevel(HINSTANCE hInstance)
{

    LPCSTR szFileName1("..\\Assets\\TILE_01.bmp");
    LPCSTR szFileName2("..\\Assets\\Tile_02.bmp");
    LPCSTR szFileName3("..\\Assets\\Tile_03.bmp");

    Sprite* Tile_01 = new Sprite(); /*Tile_01 is the grass sprite*/
    Sprite* Tile_02 = new Sprite(); /*Tile_02 is the wall sprite*/
    Sprite* Tile_03 = new Sprite(); /*Tile_03 is the end point sprite*/

    int XCoord = 0;
    int YCoord = 0;

    const int Columns = 3;
    const int Rows = 3;

    char MazeMap[Rows][Columns] = {
        {1,2,3},
        {1,2,3},
        {1,2,3}
    };

    for (int x = 0; x < Rows; x++)
    {
        for (int y = 0; y < Columns; y++)
        {
            switch (MazeMap[x][y])
            {
            case GRASS: /*TILE_01*/
                Tile_01->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0);
                Tile_01->LoadSprite(hInstance, szFileName1, XCoord, YCoord, 25, 25);
                Tile_01->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile

                ChangePosition(XCoord, YCoord); //Change position
                break;

            case WALL: /*TILE_02*/  
                Tile_02->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0);
                Tile_02->LoadSprite(hInstance, szFileName2, XCoord, YCoord, 25, 25);
                Tile_02->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile

                ChangePosition(XCoord, YCoord); //Change position
                break;

            case END: /*TILE_03*/
                Tile_03->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0);
                Tile_03->LoadSprite(hInstance, szFileName3, XCoord, YCoord, 25, 25);
                Tile_03->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile

                ChangePosition (XCoord, YCoord); //Change position
                break;
            }
        }
    }

}

/*
This method changes the XCoord and YCoord to pass into the sprite draw method 
so the tile is drawn in the correct position
*/
int TileMap::ChangePosition(int XCoord, int YCoord)
{
    if (XCoord != 50) //if (XCoord != screenWidth) //Change position
    {
        XCoord += 25;
    }
    else if (XCoord == 50 && YCoord != 50) //else if (XCoord == screenWidth && YCoord != screenHeight)
    {
        XCoord = 0;
        YCoord += 25;
    }
    return XCoord, YCoord
}

1 个答案:

答案 0 :(得分:1)

默认情况下,函数参数按值传递。这意味着当您在函数中分配参数变量时,它们对调用者的变量没有影响。

您可以通过引用更改函数以获取其参数。然后分配将修改调用者的变量。

for (int stelle=0; stelle < array[i].length; stelle++)
{
    if(array[i][stelle] != 0)
    {
        tiere++;
    }
}

您无需从此函数返回任何内容,因为它会修改参数。我已将其更改为void TileMap::ChangePosition(int &XCoord, int &YCoord) { if (XCoord != 50) //if (XCoord != screenWidth) //Change position { XCoord += 25; } else if (XCoord == 50 && YCoord != 50) //else if (XCoord == screenWidth && YCoord != screenHeight) { XCoord = 0; YCoord += 25; } } 函数。

void是有效的语法,但它不符合您的想法。见How does the Comma Operator work

相关问题