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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:54:29