factory_clashes函数if条件为假仍执行、冲突计数不符预期问题
工厂任务排程冲突检测函数异常排查
异常原因定位
- 冲突对重复计数:原代码的双重循环遍历所有有序索引对,同一组冲突(如task[0]与task[7])会被判定两次:一次是
j=0、i=7时命中,另一次是j=7、i=0时也命中,直接导致计数翻倍 - 计数变量残留:如果
count是全局变量,多次调用函数时会保留上一次运行的累加值,不会自动清零,进一步导致计数偏移 - 所谓“条件为假仍执行逻辑”属于误判:上述两个问题的叠加效果,会让输出结果看起来不符合预期,并非if判断逻辑失效
- 返回值缺失:函数声明为
int返回类型,但没有对应的返回语句,属于未定义行为
修复后的代码实现
int factory_clashes() { // 计数变量改为函数内局部变量,每次调用自动初始化为0,避免全局残留问题 int count = 0; //find out how many tasks are assigned to same factory at same time and same date cout<<count<<endl; for(int j=0; j<8; j++) { // 调整i的起始值为j+1,仅比较j之后的任务,避免重复判定同一对冲突 for(int i=j+1; i<8; i++) { // 嵌套if合并为逻辑与判断,逻辑和原实现完全一致,更清晰 if(Task[j].WorkshopID==Task[i].WorkshopID && Task[j].MachineID==Task[i].MachineID && Task[j].StartDate.Day==Task[i].StartDate.Day && Task[j].StartTime.Hours==Task[i].StartTime.Hours) { cout<<j<<" th value "<<i<<" th iteration "<<count<<endl; count++; cout<<count<<endl; } } } cout<<"CLASHES"<<endl<<count<<endl; // 补充返回值,匹配函数声明的int返回类型 return count; }
修复后效果
按照调整后的逻辑,仅task[0]与task[7]的冲突会被判定1次,最终计数和输出完全符合硬编码测试数据的预期。
内容的提问来源于stack exchange,提问作者Muhammad Suleman
相关产品推荐
相关产品推荐

