今天写代码时,遇到了读多个不同引脚状态的情况,首先想到的是使用if else或者switch case方法,有没有别的方法来取代以上方法呢?答案肯定是有的,介绍一种方法那就是表驱动。
表驱动概念:表驱动法是一种编程模式,从表里面查找信息而不使用逻辑语句(if 或case),它的好处是消除代码里面到处出现的if、else、swith语句,让凌乱的代码变得简明和清晰,对简单情况而言,表驱动方法可能仅仅使逻辑语句更容易和直白,但随着逻辑的越来越复杂,表驱动法就愈发有吸引力。表驱动法设计主要是两个方面 : 对象数据设计;对象关系设计。有点像key :value的感觉。
C语言的表驱动方法是一种使用数组来实现某些操作的编程技术。它通常用于嵌入式系统中,可以简化程序结构,提高代码的可读性和可维护性。表驱动方法的基本思想是将一些数据存储在数组中,然后通过索引来访问这些数据。在C语言中,表驱动方法通常用于实现状态机、查找表和按键驱动等功能。例如,可以使用表驱动方法来实现一个事件驱动型按键驱动模块,可以无限量扩展按键,按键事件的回调异步处理方式可以简化程序结构,按键业务逻辑更清晰。
看下示例代码:
//每个状态执行一次,执行完毕,退出程序。
#include <stdio.h>
typedef enum
{
STATE_IDLE,
STATE_RUNNING,
STATE_STOPPED
} state_t;
typedef struct
{
state_t state;
void (*handler)(void);
} state_table_t;
void idle_handler(void)
{
printf("Idle state\n");
}
void running_handler(void)
{
printf("Running state\n");
}
void stopped_handler(void)
{
printf("Stopped state\n");
}
state_table_t state_table[] =
{
{STATE_IDLE, idle_handler},
{STATE_RUNNING, running_handler},
{STATE_STOPPED, stopped_handler}
};
int main(int argv,char *argc[])
{
state_t current_state = STATE_IDLE;
while (1)
{
state_table[current_state].handler();
current_state = (current_state + 1) % 3;
if(current_state == 0)
{
break;
}
}
return 0;
}
运行结果: