目录
一、前言
开发面对对象的C工程和大型复杂工程中面对多事件多状态情况下,使用函数数组将使工程变得简洁、容易维护
二、回调函数
函数指针:
可变参数:
返回类型 函数名(classtype, …){}
指针函数本质是函数返回指针类型,函数指针是具有函数功能的指针,可以赋值,也可以传参。
定义一个函数指针,传递不确定个数的参数
typedef void (* CB_FUNC_PTR)(…)
定义一个函数指针,传递确定个数的参数
typedef void (* CB_FUNC_PTR)(int a, int b)
定义函数,将参数指针作为参数传递:
Void usrfunc(int data1, CB_FUNC_PTR cb_func, int b)
{
Int a;
Cb_func(a.b);
}
它有什么用处呢,诊断UDS应用层,在面临多流程多NRC情况下,可以择时调用诊断响应返回响应的NRC。
三、函数Table
定义事件和编号列表,定义函数数组Table,这样可以在接收事件后,可以直接从表中调用对应的处理函数:
定义函数指针
typedef char (*event_function)(uchar* ptrMsg, uchar msgSize );
定义数组:
event_function event_func_matrix[Event_DEF_MAX]={
(event_function)event_func1,
(event_function)event_func2,
};
Void main_loop
{
Uchar no = Get_event_no()
event_func_matrix(&msg[0], msgSize);
}
四、高阶用法
我们在实际场景中会有这样的情况,有正常模式,烧程模式,校准模式 3种模式,每种模式都有最多10个不同的子状态,然后还有30种可操作函数。
定义函数指针
Typedef void(*sys_run_func)(void);
定义二维数组:
sys_run_func sys_run_func_table[][30]={
{sys_state1,…},…, {sys_state10,…}
};