You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类bool成员函数新增复杂判定条件后无返回值问题咨询

问题原因及修复方案

核心问题根因

  • 数组越界触发未定义行为:
    修改后的内层循环条件改为了j < vect[i].size(),当j取vect[i].size()-2或vect[i].size()-1时,访问j+1、j+2会超出当前行的边界;同时纵向判定没有限制i的范围,当i取vect.size()-2或vect.size()-1时,访问i+1、i+2会超出二维数组的行边界。C++中数组越界属于未定义行为,会直接导致程序运行逻辑异常,你遇到的无打印输出、返回值错误都是典型的越界副作用。
  • 必要代码行丢失:
    修改后的代码删除了两行核心逻辑:一是bool controller=false;变量定义初始化语句,未初始化的局部变量取值完全随机,自然无法返回正确的布尔值;二是cout<<vect[0][0];打印语句,自然不会输出对应元素。
  • break逻辑存在缺陷:
    原有代码里的break只能跳出内层的j循环,外层的i循环还会继续执行,虽然不是致命错误,但会产生不必要的遍历开销。

修复后的完整control_vect函数

bool board :: control_vect(){
    long unsigned int i,j;
    bool controller = false;
    cout << vect[0][0]; // 保留原打印逻辑,不需要可直接删除

    // 横向走法判定:限制j最大为行长度-3,避免j+2越界
    for (i = 0; i < vect.size(); i++){
        for (j = 0; j < vect[i].size() - 2; j++){
            if( (vect[i][j]==peg && vect[i][j+1]==peg && vect[i][j+2]==empty)
             || (vect[i][j]==empty && vect[i][j+1]==peg && vect[i][j+2]==peg) ){
                return true; // 找到合法走法直接返回,无需继续遍历
            }
        }
    }

    // 纵向走法判定:限制i最大为总行数-3,避免i+2越界
    for (i = 0; i < vect.size() - 2; i++){
        for (j = 0; j < vect[i].size(); j++){
            if( (vect[i][j]==peg && vect[i+1][j]==peg && vect[i+2][j]==empty)
             || (vect[i][j]==empty && vect[i+1][j]==peg && vect[i+2][j]==peg) ){
                return true; // 找到合法走法直接返回
            }
        }
    }

    return false; // 遍历完全局未找到合法走法
}

修复后的代码会正确判定棋盘是否存在合法走法,存在则返回true输出a,否则返回false输出b,同时保留原有的vect[0][0]打印逻辑。

内容的提问来源于stack exchange,提问作者Vito Metvet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:15:03