c - 奇怪的控制流程顺序

标签 c maze

我被分配编写一个“迷宫”程序,该程序将允许用户通过从头到尾导航来玩和解决随机迷宫。到目前为止,我已经开发了一个可以在预定义迷宫中运行良好的工作原型(prototype),但该机构要求我使其尽可能随机。为此,我添加了一个函数“findpath”,用于检查并验证随机迷宫是否可以解决,或者调用“mazebuilder”来创建另一个随机迷宫。整个代码在这里: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

最佳答案

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

有问题的代码是在递归调用 findpath 之前不检查 xy 的边界。递归可能导致 x 和/或 y 变得小于零或大于 scr+1

注意:同样在迷宫加载器中,您有不必要的递归,最终会导致堆栈溢出: if(findpath(start.x,start.y))...else goto top; 而不是else mazeloader(); 甚至更好,将迷宫加载器与用户玩的游戏分开。

关于c - 奇怪的控制流程顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958099/

相关文章:

java - 我的 Prim 算法无法正确生成迷宫

JAVA - 我怎样才能 build 我的迷宫形状?

algorithm - 如何保证元胞自动机生成的迷宫是可解的/有趣的?

c++ - 生成的代码中带有新行的 C 宏

c - 我需要一个 "so"文件还是有什么问题?

c - 在 C 中列出数组

algorithm - 以 block 代替墙的深度优先搜索迷宫生成算法

c++ - 应用程序中两个不同版本的库

python - 如何将 SwigPyObject 转换为 ctypes void*

java - Java中的递归迷宫