结果与设置变量不匹配:跑卫单场冲球数超60,循环逻辑异常
体育模拟类程序冲球计数超标异常排查
异常表现
开发体育模拟类程序时,运行结果出现跑卫单场冲球次数达60+的反常情况,与设计预期严重不符。
已知team为程序中的数组结构,原有设计逻辑下对应冲球循环最多仅应执行25次,根本达不到60+冲球数的量级。临时测试中将循环条件硬编码为for(int g = 1; g < 20; g++)的固定上限后,依然会无理由出现冲球次数超标的问题,目前未定位到问题根源。
关联问题代码片段
hold3 = rand() % (10 - 15 + 1) + 15; for(int g = 1; g < hold3; g++){ hold = rand() % (15 - team[u].elusivness[2] + 1) + team[u].elusivness[2]; if(hold == 13 || hold == 14){ team[u].carries[2]++; hold = rand() % (17 - team[u].strength[2] + 1) + team[u].strength[2]; if(hold == 13){ team[u].rushingtouchdowns[2]++; hold = rand() % 25 + 5; team[u].rushingyards[2] += hold; }else{ hold = rand() % (12 - team[u].speed[2] + 1) + team[u].speed[2]; if(hold == 12){ hold = rand() % 15 + 5; team[u].rushingyards[2] += hold; }else{ hold = rand() % 5 + 1; team[u].rushingyards[2] += hold; } } } }
核心排查方向
- 校验代码块的实际执行频次:确认上述冲球逻辑是否被外层循环、多回合比赛流程重复触发。即便单段循环仅执行20次,若被外层调用3次,累计冲球数就会达到60的量级,与观察到的异常表现完全匹配
- 修正伪随机数计算的顺序错误:原代码中
rand() % (10 - 15 + 1)的本意是生成10-15范围的随机数作为循环上限,但参数顺序写反后,取模运算的除数为负数,C语言环境下负数取模的结果是实现定义的,极可能生成远大于预期的hold3值,导致循环次数失控 - 排查数组索引的合法性:检查
team数组的索引u的取值范围,确认是否存在越界访问、指向无效内存的问题,避免计数写入错位导致统计值异常 - 排查计数变量的其他累加路径:全局检索
team[u].carries[2]的自增逻辑,确认是否存在其他非预期的代码块也在对该位置的计数做累加操作
内容的提问来源于stack exchange,提问作者Troy Cox
相关产品推荐
相关产品推荐

