【问题标题】:Why does the folloing code throw an illegal instruction exception in visual studio 2010 (x64 application)? [closed]为什么以下代码会在 Visual Studio 2010(x64 应用程序)中引发非法指令异常? [关闭]
【发布时间】:2025-12-24 12:50:10
【问题描述】:

我有一个 2D 游戏,其中每个位置都使用 3 个坐标(x = 宽度、y = 高度和地板 = z)构建

我尝试编写一个函数,它会向我抛出从开始位置到结束位置的所有地砖列表。

以下代码抛出“非法指令”——异常。我很困惑:

std::list<Tile*> Map::getTileArea(Position positionStart, Position positionEnd)
{
    std::list<Tile*> tileAreaList;

if(positionStart.x > positionEnd.x) {
    std::swap(positionStart.x, positionEnd.x);
}

if(positionStart.y > positionEnd.y) {
    std::swap(positionStart.y, positionEnd.y);
}

if(positionStart.z > positionEnd.z) {
    std::swap(positionStart.z, positionEnd.z);
}


    for(int _x = positionStart.x; _x < positionEnd.x; _x++) {//<-Exception occurs here.
        //Procedurestepping told me that but I cannot find an explanation for this.
        for(int _y = positionStart.y; _y < positionEnd.y; _y++) {
        for(int _z = positionStart.z; _z < positionEnd.z; _z++) {
            Tile* tile = getTileByPosition(Position(_x, _y, _z));
            if(tile != NULL) {
                tileAreaList.push_back(tile);
                }
            }
        }
    }

    return tileAreaList;
}

谁能帮帮我?谢谢。

【问题讨论】:

  • 哪里抛出异常?
  • (瓷砖的)面积是偶数平方吗?其中 max x == max y == max z?
  • for(int _x = positionStart.x; _x
  • 您在所有三个 if 情况下都在 x 坐标上执行 std::swap() 。难道是y和z没有正确交换?
  • 这可能与问题无关,但即使在比较了yz 之后,您也总是交换x;我不认为那是你想要的。

标签: c++ loops exception


【解决方案1】:

看起来像剪切粘贴错误:

if(positionStart.y > positionEnd.y) {
     std::swap(positionStart.y, positionEnd.y);
}

if(positionStart.z > positionEnd.z) {
    std::swap(positionStart.z, positionEnd.z);
}

【讨论】:

  • 我一直想知道 - 什么是“剪切粘贴”错误?怎么会这样?
  • 通常发生在您多次复制相同的代码,然后只对其进行部分修改,从而导致逻辑中断。
  • 我已经解决了这个问题,但对解决异常没有帮助。
  • Position 类中的 x,y,z 类型是什么?
  • 我并不是建议您不要剪切和粘贴...这只是一个常见错误。无时无刻不在发生。
最近更新 更多