C 函数查表法

这是一段示例代码,仅用于表达设计意图,可能存在语法错误,
本示例代码演示如何解耦大的switch语句,让其模块化更好;
未做防御式编程处理

typedef void (* protocol_process)(uint8_t *buf, uint len);

/**
 * 注册一个处理函数
 * 参数说明:
 * fun 传入的函数
 * funId 该函数的功能编号
 */
void  register_process(fun_process fun,uint8_t funId);

void init();

/*
 * 收到数据帧后调用的处理
 * */
void main_process(uint8_t *buf,uint len);


//-----------------------------我是头文件的结束的分割线-------------------------------------------

/*使用static 使其对外部文件不可见*/
static protocol_process cmdList[256];



/*
 * 占位函数保证执行过程中不会调用到空函数
 * */
void ErrCmdDo(uint8_t *buff,uint8_t len)
{
    Log("未实行的功能\r\n");   
}

/*
 * 使用占位函数初始处理函数数组
 * */
void init()
{
   for(int i=0;i<256;i++)
   {
        cmdList[i]=ErrCmdDo;
   }

}

void  register_process(fun_process fun,uint8_t funId)
{
     cmdList[funId]=fun;
}

void main_process(uint8_t *buf,uint len);
{
    uint8_t cmd=GetCmd(buf,len);//*获取输入数据的功能号
    protocol_process  process=cmdList[cmd];
    (*process)();
}


/*--------------------------------------------我是功能函数实现文件的分割线-------------------------------------------------------------*/

#include <register_process.h>

void  say_hello_init()
{
     register_process(SayHello,2); 
}


static void SayHello( uint8_t *buff,uint8_t len)
{
    printf("你好\r\n");   
}

面向对象风格的写法


//-------------------------------protocol_process.h 协议处理头文件-----------------------------------------------------

/*
 *
 * */

#define CmdMaxLen 256;
typedef void (* protocol_process)(uint8_t funId,uint8_t *buf, uint len);




sturct protocol_obj
{
    protocol_process_list[CmdMaxLen];
};

/**
 * 注册一个处理函数
 * 参数说明:
 * fun 传入的函数
 * funId 该函数的功能编号
 */
void  protocol_obj_register_process(sturct protocol_obj * thiz,fun_process fun,uint8_t funId);

void protocol_obj_init(sturct protocol_obj *thiz,protocol_process defaultFun);

/*
 * 收到数据帧后调用的处理
 * */
void protocol_obj_process(sturct protocol_process *thiz,int funId,uint8_t *buf,uint len);


//-----------------------------我是头文件的结束的分割线-------------------------------------------




/*
 * 占位函数保证执行过程中不会调用到空函数
 * */
void ErrCmdDo(uint8_t *buff,uint8_t len)
{
    Log("未实现的功能\r\n");   
}

/*
 * 使用占位函数初始处理函数数组
 * */
void protocol_obj_init(sturct protocol_obj *thiz,protocol_process defaultFun);
{
   for(int i=0;i<CmdMaxLen;i++)
   {
        thiz->protocol_process_list[i]=defaultFun;
   }

}

void  protocol_obj_register_process(sturct protocol_obj * thiz,fun_process fun,uint8_t funId)
{
     thiz->protocol_process_list[funId]=fun;
}

void protocol_obj_process(sturct protocol_process *thiz,int funId,uint8_t *buf,uint len)
{
    protocol_process  process=thiz->protocol_process_list[funId];
    (*process)(funId,buf,len);
}


/*--------------------------------------------我是功能函数实现文件的分割线-------------------------------------------------------------*/

#include <register_process.h>

#define CmdCode=2;

void  say_hello_init(sturct protocol_process *obj)
{
     register_process(obj,SayHello,CmdCode); 
}


static void SayHello(uint8_t funId, uint8_t *buff,uint8_t len)
{
    printf("你好\r\n");   
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值