是什么导致数组超出边界运行时错误?

时间:2016-11-30 20:37:58

标签: c++ arrays bounds breadth-first-search

这是一个类的方法,用于找到表示为3-d数组的3维迷宫的出口。数组本身包含长度为6或1或0的字符串.A' 1'在字符串中意味着你可以朝那个方向移动。例如,如果当前数组元素的字符串为100001,则表示您可以向北移动,也可以向下移动一个级别。位串对应于东北向西的向下方向。此方法目前尚未完成,因此我知道它尚未找到可行的解决方案,但最后的switch语句会导致运行时数组超出界限错误。我将3-d数组描绘成3维立方体,其中outtermost数组表示垂直轴,中间数组表示进出页面的z轴,最内部数组表示水平x轴。当在迷宫中的当前单元格时,您会查看字符串中的每个位。对于每个可能的移动,您将该移动添加到q。完成查看字符串后,您将按照首次添加到队列的方向移动并重复。非常感谢任何帮助。

void maze::solve(int startlevel, int startrow, int startcol, int endlevel,   int endrow, int endcol)
{
position current, exit;
current.level = startlevel;
current.row = startrow;
current.col = startcol;

exit.level = endlevel;
exit.row = endrow;
exit.col = endcol;

q.push('0');
while (!q.empty())
{
    if (current == exit)
    {
        cout << "exit found" << endl;
        return;
    }

    if (mazeGraph[current.level][current.row][current.col].at(0) == '1')
        q.push('n');
    if (mazeGraph[current.level][current.row][current.col].at(1) == '1')
        q.push('e');
    if (mazeGraph[current.level][current.row][current.col].at(2) == '1')
        q.push('s');
    if (mazeGraph[current.level][current.row][current.col].at(3) == '1')
        q.push('w');
    if (mazeGraph[current.level][current.row][current.col].at(4) == '1')
        q.push('u');
    if (mazeGraph[current.level][current.row][current.col].at(5) == '1')
        q.push('d');

    if (q.front() == '0')
        q.pop();

    switch (q.front())
    {
    case 'n':
        current.row -= 1;
    case 'e':
        current.col += 1;
    case 's':
        current.row += 1;
    case 'w':
        current.col -= 1;
    case 'u':
        current.level += 1;
    case 'd':
        current.level -= 1;

    }

}   
return;
}

1 个答案:

答案 0 :(得分:1)

要进行调试,在访问mazeGraph[current.level][current.row][current.col]之前,您应该检查current.levelminLevel之间的maxLevel是否在current.rowcurrent.col之间所有在迷宫图的边界。如果他们没有打印current.level的消息,您就会知道为什么会抛出该错误。

我也假设您的mazeGraph已初始化,以使开始和结束等级的界限满意。

PS:为了在矩阵中的两个节点之间更好地寻路,在许多情况下发现A *(A star)算法是更好的解决方案。