【问题标题】:Segmentation Fault in C++ with Arrays [closed]带有数组的 C++ 中的分段错误 [关闭]
【发布时间】:2019-12-03 22:00:11
【问题描述】:

我有问题。我在 repl.it(许多语言的在线 IDE)上用 C++ 制作了一个“Find the Flowers”程序,每次我进行更改以确保它正常工作时,我都会继续运行它,当整个游戏完成时,我运行它几次。一切顺利。我在学校的 Chromebook 上运行它。在家里,我在家里的笔记本电脑上开始了这个项目,并且不断收到“Segmentation Fault”错误。这些错误是在我搬到家用笔记本电脑后才开始发生的。我四处搜索,发现“分段错误”是您的程序试图访问它时“不拥有”。我尝试移动到另一台 Mac,但它不起作用。第二天,我又回到学校的 Chromebook 上,但它没有用。我不知道是因为我有一个 10x10 网格(char Map[10][10] = {10x10 grid goes here}),还是因为我从其他函数内部调用函数。请帮忙。下面的链接会将您发送到我的 repl.it 代码。

https://repl.it/@AndrewBota/Find-The-Flowers

【问题讨论】:

  • 分段错误是未定义行为的一种可能表现形式(另一种可能表现形式,正如您已经看到的:正常工作)。这与数组有关,可能是由于您索引超出了所述数组的范围。但是,没有看到minimal reproducible example,是不可能确定的。
  • 欢迎来到 Stack Overflow。通常,您应该发布您的最小完整示例本身,而不是指向它的链接。在这种情况下,如何确保玩家不会离开地图?
  • 另外你需要初始化一些变量,比如玩家位置和收集的人数。
  • 通常我会将您的代码从链接复制到您的问题中,但是我绝对不会点击匿名链接并希望在另一边只找到等待我的代码。

标签: c++ segmentation-fault


【解决方案1】:

刚刚写了一个很长的答案,但我登录时没有保存,所以这里是简短的版本

您永远不会为玩家位置设置初始位置。这意味着当您分配变量 PlayerX 和 PlayerY 时,您只需从已经存在的内容中提取。有时这恰好可以正常工作。

所以设置一个初始起始位置

你需要做的另一件事是将移动限制在网格之间,所以我建议每次更新玩家位置时使用 %10

【讨论】:

    【解决方案2】:

    在您测试按下哪个 WASD 键的 Move() 函数中,您的代码如下所示

    if (PlayerMove == 'W' || 'w')
    

    总是计算为真,因为 'w' 作为布尔值转换为真。这可能是您的意思:

    if (PlayerMove == 'W' || PlayerMove == 'w')
    

    将来您可能希望添加边界检测,这样就不会发生越界引用。

    注意:很多人都在评论您应该明确初始化玩家的位置这一事实。它们是正确的,您应该这样做,但是由于您在全局范围内声明了它们,因此它们将确定性地初始化为零。见https://stackoverflow.com/a/6032889/8498150

    【讨论】:

    • 这解决了我的问题。我可以运行它而不会出现任何错误。
    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2021-08-31
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多