局部变量超出范围..我认为

Local variables going out of scope ... I think

本文关键字:范围 局部变量      更新时间:2023-10-16

我对下面的代码有问题。除了XCoordYCoord变量外,我的一切都运行良好。在ChangePosition方法中,如果 25 不等于 50,我想将 25 添加到XCoord,然后将XCoord重置为 0,如果XCoord = 50YCoord isnt equal to 50,则向YCoord添加 25。

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

我认为这一定是变量没有变化的上述 2 个原因之一。 我尝试使用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
}

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

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

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;是有效的语法,但它不会按照您的想法进行操作。请参阅逗号运算符的工作原理