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

函数传参时反复出现错误,请求技术排查与解决

排查你代码里的函数传参重复错误

我帮你梳理下这段代码里的几个关键问题,都是和传参、数组使用相关的,正好对应你说的重复错误:

1. 按值传递导致的参数修改无效问题

你写的generate_player2_move函数里,rw和cn是按值传递的参数——这意味着函数内部对它们的赋值(比如rw = rand() % 3;)只会修改函数内部的局部副本,不会影响调用这个函数时传入的外部变量。如果你的目的是让这个函数生成合法的行列值并传递回主逻辑,必须改用指针传递。

代码里的check_legal_option(a[SIZE][SIZE], rw, cn)是明显的错误:

  • a作为二维数组参数传入函数时,已经退化为指向数组的指针,直接传a就可以表示整个二维数组;
  • a[SIZE][SIZE]是访问数组的越界元素(因为数组下标从0开始,最大合法下标是SIZE-1),这会触发未定义行为,大概率导致程序崩溃或错误的判断结果。

3. srand重复初始化导致随机数不随机

如果generate_player2_move会被多次调用,每次都执行srand(time(NULL))会有问题:time(NULL)返回的是秒级时间戳,短时间内多次调用的话,种子值相同,rand()会生成完全一样的随机序列,导致AI的移动重复甚至卡死。正确的做法是把srand(time(NULL))放在程序的入口(比如main函数开头),只执行一次。

修改后的示例代码

// 先在main里初始化随机数种子,只执行一次
int main() {
    srand(time(NULL));
    // ... 其他逻辑
}

// 修改generate_player2_move为指针传参,让外部能拿到生成的行列值
void generate_player2_move(char a[SIZE][SIZE], int *rw, int *cn) { 
    char type = 'X'; 
    do {
        *rw = rand() % 3; 
        *cn = rand() % 3; 
    } while(check_legal_option(a, *rw, *cn) == 1); // 修正数组传参,改用do-while更简洁
    update_table(a, *rw, *cn, type); // 顺便调用update_table完成落子
}

// 原update_table可以保留,不过可以简化写法
void update_table(char ary[SIZE][SIZE], int row, int column, char token) { 
    if(token == 'X' || token == 'O') { // 增加简单校验
        ary[row][column] = token; 
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:34:27