gpt4 book ai didi

c++ - 超出范围的局部变量......我认为

转载 作者:行者123 更新时间:2023-11-28 05:09:40 33 4
gpt4 key购买 nike

我对以下代码有疑问。除了 XCoordYCoord 变量外,我的一切工作正常。在 ChangePosition 方法中,如果 XCoord 不等于 50,我想将 25 添加到 XCoord 中,然后将 XCoord 重置为 0,并将 25 添加到 YCoord 如果 XCoord = 50 并且 YCoord 不等于 50

我通过调试发现,当 ChangePosition 方法返回 XCoordYCoord 时,它们会恢复为 0 当调试器继续执行 switch 语句时。我认为这与 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
}

最佳答案

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

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

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

关于c++ - 超出范围的局部变量......我认为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43771581/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com