在一些逻辑代码判断中,一个函数体里面可能需要多种逻辑判断,然后确定某一变量的值或者状态,那么这个时候可以使用结构体数组的概念来解决,其实也相当于建立一个映射表一样。
以下为具体举例的代码部分,可能有不准确的地方,理解大概做法就行:
比如是一个判断温度和状态的关系,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;
}
先点赞,后浏览,不懂的地方可以评论留言!