1、函数指针数组使用笔记
函数名就是该函数的地址,可以通过指针进行寻址调用
//应用场景:对于需实现的类似功能比较多的情况,使用这种数组进行分类把类似的功能的函数通过指针的形式做成一个数组集合。
//然后通过一个数组的形式调用,通过下标区分不同的函数实现的功能,switch-case一次调用实现对于该类的函数不同的调用,避免了重复的调用,节省了大量的空间。
//通过switch case的形式实现对应函数的调用,传递过来的是一串串口的协议数字 找到对应的字段俩调用对应的函数。不需要遍历就可以实现函数的调用,采用的是一一对应的方式。
//如果没有很好的一一对应的关系就采用遍历的方式实现函数的调用
//组播的成员表在驱动部分就是这样存储的。 标红的地方对应的是函数指针数组的下标,一一对应的关系
例如:00 01 02 38 47 47 47 每个数字代表的是一个含义
有两个地方是需要注意的:
1、函数指针数组还是结构体数组,取决于需要实现的功能的情况。
2、存储的方式,数组还是链表,取决于多少。
3、一一对应还是遍历,实际情况而论
//调用的地方
process_wifi_to_zc_cmd_zigbee[cmd2](rBuf, len);
//结构体该可以以链表的形式存储起来
//注册的地方 需要实现的函数放到函数指针数组里面
//把需要注册进去的函数在这里注册使用
void (process_wifi_to_zc_cmd_zigbee[18])(int8u, int8u) = {
ProcessDeleteNetworkReq,
ProcessChangeChannelReq,
ProcessSetPermitJoiningTimeReq,
NULL,
ProcessResetToTheFactoryReq,
ProcessBindingReq,
ProcessConfigReportReq,
processGetDeviceAttributeReq,
NULL,
processSetDeviceAttributeReq,
NULL,
NULL,
ProcessNewBindingReq,
ProcessAddGroup,
ProcessRemoveGroup,
ProcessRemoveAllGroup,
ProcessGetNwkAddressReq,
process_SendCustomerData_Req,
};
//实现方式
//对应函数的实现
static void process_SendCustomerData_Req(int8u *rBuf,int8u len)
{
int16u mfg_code = mfgSpecificId;
mfgSpecificId = EMBER_AF_MANUFACTURER_CODE;
zclBufferSetup(ZCL_CLUSTER_SPECIFIC_COMMAND
|ZCL_FRAME_CONTROL_CLIENT_TO_SERVER
|ZCL_DISABLE_DEFAULT_RESPONSE_MASK,
ZCL_USER_DATA_TRANSFER_CLUSTER_ID,
ZCL_WRITE_DATA_COMMAND_ID);
mfgSpecificId = mfg_code;
zclBufferAddBuffer(&rBuf[5],12);
emberAfGuaranteedPrintln("[process_SendCustomerData_Req] buflen:%d",len);
if (EMBER_SUCCESS != status) {
}
}