【问题标题】:Strange order of flow of control奇怪的控制流顺序
【发布时间】:2015-11-27 13:06:30
【问题描述】:

我被分配编写一个“迷宫”程序,允许用户通过从头到尾导航来玩和解决随机迷宫。到目前为止,我已经开发了一个可以很好地运行预定义迷宫的工作原型,但该机构要求我使其尽可能随机。为此,我包含了一个函数“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

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及重现它所需的最短代码在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 minimal reproducible example 示例。
  • “……机构要求我……”,对不起,我笑得太厉害了,听起来像是一个阴谋,这个秘密机构试图把我们所有人都困在一个巨大的迷宫中-声明
  • 这段代码if(fpmap[x][y]!=PATH||fpmap[x][y]!=START) 应该使用&& 而不是||
  • 感谢 Bo Persson,做到了(以及其他一些错误)。无法想象我会错过那个:/

标签: c++ c controls maze flow


【解决方案1】:

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

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

注意:同样在 mazeloader 中,您有不必要的递归,最终会导致堆栈溢出:if(findpath(start.x,start.y))...else goto top; 而不是 else mazeloader();,或者更好的是,将 mazeloader 与用户播放分开。

【讨论】:

  • 我没有检查边界,因为我初始化迷宫的方式是它被 WALLS 包围。因此,如果xy 试图移动到限制之外,他们将遇到墙壁并返回FALSE。我按照您的建议将else mazeloader 替换为else goto top。感谢您的帮助。
【解决方案2】:

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

此外,您没有越界检查。

【讨论】:

  • 感谢您指出这一点。我错过了那个。关于越界检查,迷宫被墙壁包围('not path'),因此无需检查越界,这样我也限制了我的玩家不要移动到迷宫之外。
猜你喜欢
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
相关资源
最近更新 更多