奇怪的控制流程顺序

时间:2015-11-27 13:06:30

标签: c++ c controls maze flow

我被分配到编码迷宫'该程序允许用户通过从头到尾导航来播放和解决随机迷宫。到目前为止,我已经开发了一个适用于预定义迷宫的工作原型,但该机构要求我尽可能随机地制作它。为此我添加了一个函数' findpath'检查并验证随机迷宫是否可以解决或以其他方式调用迷宫制造者'创建另一个随机迷宫。整个代码在这里:http://codepad.org/wb1OGGrZ。 现在执行时,此功能显示非法的控制流程。

int findpath(int x, int y)
{
    if(fpmap[x][y]==END)    //1
    {
        return TRUE;
    }
    if(fpmap[x][y]!=PATH||fpmap[x][y]!=START)     //2
    {
        return FALSE;      //2a
    }
    min_moves++;                    //3
    fpmoves++;
    fpmap[x][y]=SOLUTION;
    if(findpath(x,y-1))      //4
    {
        return TRUE;
    }
    if(findpath(x+1,y))
    {
        return TRUE;
    }
    if(findpath(x,y+1))
    {
        return TRUE;
    }
    if(findpath(x-1,y))
    {
        return TRUE;
    }
    min_moves--;      //5
    fpmap[x][y]=PATH;
    return FALSE;     //6
}

我试图跟踪程序,这是函数在调用时执行的操作: 1.检查#1。 2.检查#2。 3.跳到#6。 那么,如果在#4或#5之后,为什么程序没有进入#2a或#3? 它似乎只是跳过整个代码并急于#6。这是一个逻辑错误还是这个语法? 请帮我解决这个问题。 PS:这段代码是为TurboC编译器编写的,因为我的院系要求我这样做。请忍受我:(

有关findpath中使用的算法的更多信息:http://www.cs.bu.edu/teaching/alg/maze

2 个答案:

答案 0 :(得分:0)

编译器有时是奇怪的野兽。我能提供的最佳解释(因为我看不到可能导致您的问题的直接编码错误)是编译器已经确定您正在引入未定义的行为并且只是拒绝编译有问题的代码(您可以通过检查生成的汇编代码来检查这一点)在调试器中。)

违规代码是您在递归调用x之前不检查yfindpath的范围。递归可能会导致x和/或y小于零或大于scr+1

N.B。:同样在mazeloader中你有一个不必要的递归,最终会导致堆栈溢出:if(findpath(start.x,start.y))...else goto top;而不是else mazeloader();甚至更好,从用户播放中分离出mazeloader。

答案 1 :(得分:0)

说明书说你应该用x(BAD_PATH)标记回溯位置,以避免再次尝试该子路径。您的代码用.(PATH)标记它们。

此外,您没有越界检查。