有没有一种简单的方法可以忽略 c++ 中的索引错误

Is there a simple way to ignore index error in c++?

本文关键字:c++ 错误 索引 方法 简单 一种 有没有      更新时间:2023-10-16
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 坐标的对象,如果有地雷,则为布尔值。计数地雷通过遍历正方形周围的每个方块并在有地雷的情况下将 +1 添加到地雷数值来计算正方形附近的地雷数量。

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

try:
         <MY CODE>
     except IndexError:
         pass

在c ++中是否有类似的方法?

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

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

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

编辑:

在c ++中是否有类似的方法?

您需要阅读有关C++trycatch的信息。

您可以通过

使用 [valuex] 而不是 at(values) 等来忽略该错误。这将使你直接陷入未定义的行为状态。别这样。解决此问题有两种简单的方法:添加保护方块,或在索引到数组之前检查边界。

对于保护方块,而不是数组的大小,将每个维度增加 2。当您访问"真实"方块时,为每个索引值加 1。当你数数时,只需以与现在相同的方式访问方块。通过在雷区周围放置一个护卫方块的边界,您可以使用与雷区边界 1-off 的索引值,而无需超出基础数组。

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

你的问题是缺乏抽象。

如果你有一个用于

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

提前计算您的限制并使用它们,而不是将计算包含在 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 与这些值