【问题标题】:Is there a simple way to ignore index error in c++?有没有一种简单的方法可以忽略 C++ 中的索引错误?
【发布时间】:2018-01-31 16:24:05
【问题描述】:
int Square::countmines(){
    int numofmines = 0;
    for (int valuey = y_ - 1; valuey < valuey + 2; valuey ++){
        for (int valuex = x_ -1; valuex < valuex + 2; valuex ++){
            if(lauta_-> at(valuex).at(valuey).returnmine() == true){
            numofmines ++;
            }
        }

我正在尝试用 C++ 为学校项目编写一个扫雷游戏。 Square 是一个具有 x 和 y 坐标的对象,如果有地雷,则为布尔值。 Count mines 通过遍历周围的每个方格来计算该方格附近有多少地雷,如果有地雷,则 numofmines 值加 +1。

问题是当计算棋盘边缘的一个正方形的一个正方形的附近的地雷时,程序会抛出一个索引错误。在 python 中,我可以像这样修复它:

try:
         <MY CODE>
     except IndexError:
         pass

在c++中有类似的方法吗?

【问题讨论】:

  • 您不会忽略错误。你修复它们。不要越界。只需添加检查。
  • 然后检测边缘条件并根据需要进行调整。
  • 如果有的话就叫Javascript...
  • 这种特殊情况必须由代码明确处理。
  • 或在雷区周围添加额外的单元格并在该边界内迭代。因此,不是从 0 到 9 循环 10 个单元格,而是有 14 个单元格并从 2 到 11 循环

标签: c++


【解决方案1】:

问题是当计算棋盘边缘的一个正方形的一个正方形的附近的地雷时,程序会抛出一个索引错误。

是的,它告诉你不要那样做。您不会忽略错误,而是修复代码以停止这样做。

您需要让程序检测到edge case 并以不同的方式处理它。这就是编程的意义所在,而不仅仅是对所有情况都做同样的事情而忽略错误。

编辑:

在c++中有类似的方法吗?

您需要阅读 C++ 中的 trycatch

【讨论】:

  • 我编辑了我的客人,我觉得我不够具体
  • 我希望您不要仅仅从 stackoverflow 问题中学习 C++。任何 C++ 书籍或课程都应该涵盖如何处理异常。
  • 阿门。但是,IMO 使用异常绝对不是执行此操作的正确方法。您的程序每转都会多次通过异常处理机制,因为您不必费心使用其他建议的解决方案来编写具有良好卫生水平的代码。例外是在特殊情况下,而不是在平凡的情况下节省打字。
  • 完全同意,这就是为什么我决定不展示处理异常的代码。这一点以及需要证明这一点的事实是相当懒惰的,很容易在网上找到答案。
【解决方案2】:

您可以通过使用[valuex] 而不是at(values) 等来忽略该错误。这将使您直接进入未定义的行为领域。不要那样做。有两种直接的方法可以解决这个问题:添加保护方块,或者在索引到数组之前检查边界。

对于保护方块,而不是数组的大小,将每个维度增加 2。当您访问“真实”方块时,将每个索引值加 1。当您数数时,只需以与您现在相同的方式访问方块。通过在雷区周围设置防护方块的边界,您可以使用距离雷区边界 1-off 的索引值,而不会超出底层数组。

要检查边界,当您处于雷区边缘时,不要使用 -1 或 +2 索引。

【讨论】:

    【解决方案3】:

    你的问题是缺乏抽象。

    如果你有一个用于比赛场地的类,它有一个很好的访问器函数来判断一个场地是否是地雷,那么你可以只修改那个访问器来返回 false 越界而不是错误。

    【讨论】:

      【解决方案4】:

      提前计算您的限制并使用它们,而不是将计算包含在 for 循环中。您还将修复其他错误(valuey

      int Square::countmines(){
          int numofmines = 0;
          auto lowerx = std::max(x_ - 1, 0);
          auto upperx = std::min(x_ + 1, (int)lauta_->size());
          for (int valuex = lowerx; valuex < upperx; valuex ++){
              auto lowery = std::max(y_ - 1, 0);
              auto uppery = std::min(y_ + 1, (int)lauta_->at(valuex).size());
              for (int valuey = lowery; valuey < uppery; valuey ++){
                  if(lauta_-> at(valuex).at(valuey).returnmine() == true){
                      numofmines ++;
                  }
              }
          }
          return numofmines;
      }
      

      如果您将宽度和高度存储为类中的值,则可以将这些 size() 调用和转换为 int 与这些变量代替

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 2017-11-05
        • 2013-02-10
        • 1970-01-01
        相关资源
        最近更新 更多