- 第一种,
- 优点:对应关系很明显加功能码很简单
- 缺点:遍历导致时间长
typedef enum
{
OPENPOWR = 0x03,
CLOSEPOWR = 0x01,
} ServiceName;
typedef struct
{
void (*funchandle)(void);
ServiceName funccode;
} ORDER_LIST;
void open_power()
{
printf("open_power\n");
}
void close_power()
{
printf("close_power\n");
}
static ORDER_LIST order_list[] = {
{open_power, OPENPOWR},
{close_power, CLOSEPOWR},
};
void OrderDeal(uint8_t funccode)
{
for (uint8_t i = 0; i < sizeof(order_list)/sizeof(order_list[0]); i++)
{
if (funccode == order_list[i].funccode && order_list[i].funchandle != NULL)
{
order_list[i].funchandle();
}
}
}
- 第二种
- 优点:简单,只需要建表,有规律的功能码可以使用,例如0xC9,CA,CB这种直接减去200就可以
- 缺点:功能码不连续没有规律的话,最后一个功能码过大就会白白浪费空间。
typedef void (*Tfunc) (void);
Tfunc func_table[] = {
[0x01] = open_power,
[0x0A] = close_power,
};
(*func_table[0x01])();
- 这样的话,虽然节省空间了,但是State是什么状态,还需要根据功能码数值使用if判断,好像又回到了原点
typedef void (*Tfunc) (void);
typedef enum {
OPEN_POWER,
CLOSE_POWER,
FUNC_COUNT
}State;
void open_power(void);
void close_power(void);
Tfunc func_table[FUNC_COUNT] = {
[OPEN_POWER] = open_power,
[CLOSE_POWER] = close_power
};
(*func_table[State])();
第一种和第二种合适的话用也挺好,但函数指针用起来要小心野指针
总结:用switch挺好,效率也挺好