关于优化代码中if,else过多的“屎山“问题

在一些逻辑代码判断中,一个函数体里面可能需要多种逻辑判断,然后确定某一变量的值或者状态,那么这个时候可以使用结构体数组的概念来解决,其实也相当于建立一个映射表一样。

以下为具体举例的代码部分,可能有不准确的地方,理解大概做法就行:

比如是一个判断温度和状态的关系,if(温度大于多少){当前状态 = 某一状态},依次类推就会产生很多的if else

优化:定义状态枚举

enum
{
	NORMA,            //正常
	ARLARM_L    = 4,//低报
	ARLARM_H    = 5,//高报
	ARLARM_BH		=8,//超级高报
	ARLARM_BBH		=11,//超级高报

}s_status ;

已知温度可能是0,20,50,70,80

定义结构体

typedef struct
{
    int temp;
    s_status status;

}Temp_status;

初始化结构体,并计算元素个数

Temp_status temp_status_table[] = {
	{80, ARLARM_BBH},
	{70, ARLARM_BH},
	{50, ARLARM_H},
	{20, ARLARM_L},
	{0, NORMA},

};

int num = sizeof(temp_status_table) / sizeof(temp_status_table[0]);

然后把那些if else替换for循环实现

for(u8 i = 0; i < num-1; i++)
{
    if(curr_temp > temp_status_table[i].temp)
    {
        curr_status = temp_status_table[i].status;
         break;
    }
   
}

同理:

如果是处理多个函数体的执行也可以使用结构体组的概念,减少代码的冗余,提高代码的效率和可读性。

typedef void (*cb_t)(void)

typedef struct
{
    char *name;
    cb_t call_back;

}cmd_t;


//初始化结构体列表
cmd_t  func_table[]
{
  {"name1",func1},
 {"name2",func2},
 {"name3",func3},
...


};

//计算元素数量
int num = sizeof(func_able) / sizeof(cmd_t);


//定义执行函数 根据传入的命令名,执行对应的函数

cmd_t *find_name(char *cmd_name)
{
    for(u8 i = 0; i < num; i++)
    {
        if(!strcmp(cmd_name, func_table[i].name))
        return &func_table[i];
    }
    return 0;
}


cmd_t pcmd = find_name((char*)cmd_name);
if(pcmd != NULL)
{
    pcmd->callback;
}

先点赞,后浏览,不懂的地方可以评论留言!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值