【问题标题】:Local variables going out of scope ... I think局部变量超出范围......我认为
【发布时间】:2017-05-03 23:30:28
【问题描述】:

下面的代码有问题。除了XCoordYCoord 变量外,我的一切工作正常。在ChangePosition 方法中,如果XCoord 不等于50,我想将25 添加到XCoord,然后将YCoord 添加25,如果XCoord = 50YCoord isnt equal to 50

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

我认为这一定是变量没有变化的上述两个原因之一。 我尝试使用LoadLevel 方法中的2 个变量初始化结构Coords coords;,并将结构传递给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
}

【问题讨论】:

  • 你不能在一个return 语句中返回两个东西。 return XCoord, YCoord 有效,但它使用的是逗号运算符,所以它等价于return YCoord
  • 即使你可以返回多个值,你也永远不会将函数的结果分配给任何东西。

标签: c++ variables struct syntax scope


【解决方案1】:

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

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

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 函数。

return XCoord, YCoord; 是有效的语法,但它并没有按照你的想法做。见How does the Comma Operator work

【讨论】:

  • 致 OP。如果你想返回两个东西,考虑使用标准库&lt;utility&gt; 中的std::pair。当然,这里不需要。
猜你喜欢
  • 2014-01-13
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
相关资源
最近更新 更多