C语言if语句未正常工作 条件触发逻辑异常排查求助
问题说明
程序包含二维数组ir_data[60][768]处理逻辑,预期设计如下:
- While循环仅当当前行存在大于等于30的数值时,才会调用
Hotspotberechnung函数 Hotspotberechnung函数将传入的行数据存入规格为[24][32]的数组后打印数组内容
实际运行异常:即便数组中不存在大于等于30的数值,程序仍会执行打印操作,自行排查未定位到错误。
原实现代码
While循环实现
int8_t Temperatur[768] = {0}; while (get_ir_data( &Temperatur[0], sizeof(Temperatur)/sizeof(Temperatur[0])) == 0) { for(int k=0; k<768; k++) { if(Temperatur[k] >= 30) { Hotspotberechnung(Temperatur,bild); } } }
Hotspotberechnung函数实现
bool Hotspotberechnung(int8_t tabelle1[768],int8_t tabelle2[24][32]) { int i=0, j=0, x=0, y=0; for(j=0; j<24; j++) //Tabellen werden gefüllt { for(i=0; i<32; i++) { tabelle2[j][i] = tabelle1[(j*24)+i]; } } for(j=0; j<24; j++) { for(i=0; i<32; i++) { printf("%d.%d=%d\n",j,i,tabelle2[j][i]); } }
get_ir_data函数实现
int8_t get_ir_data(int8_t* data, int n) { static uint8_t idx = 0; if (n != 24 * 32) { printf("Invalid size of array data!\n"); return -1; } memcpy(data, ir_data[idx], n); idx++; if (idx >= sizeof(ir_data) / sizeof(*ir_data)) return -2; return 0; }
错误定位
代码存在4个明确问题,直接或间接导致异常:
- 热点判断逻辑缺陷:遍历温度数组时,只要检测到一个≥30的值就立刻调用处理函数,但既没有标记帧状态,也没有在命中条件后跳出遍历。如果
get_ir_data拷贝数据不完整导致数组残留旧值(比如上一帧的热点数据),就会在当前帧无热点时误触发打印;如果一帧内有多个热点,还会重复调用打印函数。 - 二维数组索引计算错误:一维数组转24行×32列二维数组的行优先偏移公式为
行号 × 列数 + 列号,代码中错误使用行数24计算偏移(写为j*24 +i),导致二维数组内数据错位、重叠,打印内容完全不符合实际排布。 - 非void函数缺失返回值:
Hotspotberechnung定义返回值为bool类型,但函数实现中没有任何return语句,触发C语言未定义行为,可能引发不可预期的运行时错误。 - 内存拷贝风险:
memcpy拷贝长度直接传入参数n,没有结合元素类型计算;如果ir_data的元素类型不是int8_t(比如为uint16_t存储原始采样值),会导致每次只拷贝部分数据,数组后半段残留旧值,直接误触发热点判断。
修正后代码
主循环修正
int8_t Temperatur[768] = {0}; int8_t bild[24][32] = {0}; // 必须显式定义bild数组,避免野指针 while (get_ir_data(&Temperatur[0], sizeof(Temperatur)/sizeof(Temperatur[0])) == 0) { uint8_t has_hotspot = 0; for(int k=0; k<768; k++) { if(Temperatur[k] >= 30) { has_hotspot = 1; break; // 命中第一个热点即跳出遍历,避免重复判断 } } // 整帧判断完成后,确认有热点再调用处理函数 if(has_hotspot) { Hotspotberechnung(Temperatur, bild); } }
Hotspotberechnung函数修正
bool Hotspotberechnung(int8_t tabelle1[768],int8_t tabelle2[24][32]) { int i=0, j=0; for(j=0; j<24; j++) { for(i=0; i<32; i++) { // 修正偏移公式,使用列数32计算行偏移 tabelle2[j][i] = tabelle1[(j*32)+i]; } } for(j=0; j<24; j++) { for(i=0; i<32; i++) { printf("%d.%d=%d\n",j,i,tabelle2[j][i]); } } return true; // 补全bool类型返回值 }
get_ir_data函数修正
// 必须保证ir_data定义为 int8_t ir_data[60][768]; 否则需要调整memcpy长度 int8_t get_ir_data(int8_t* data, int n) { static uint8_t idx = 0; if (n != 24 * 32) { printf("Invalid size of array data!\n"); return -1; } memcpy(data, ir_data[idx], n * sizeof(int8_t)); // 明确按元素类型计算拷贝长度 idx++; if (idx >= sizeof(ir_data) / sizeof(*ir_data)) { return -2; } return 0; }
内容的提问来源于stack exchange,提问作者Luca Schneider
相关产品推荐
相关产品推荐

