[软件资料] 回调函数例子应用

[复制链接]
 楼主| LOVEEVER 发表于 2024-4-7 11:23 | 显示全部楼层 |阅读模式

1、一个四则运算的简单回调函数例子:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. /****************************************
  4. * 函数指针结构体
  5. ***************************************/
  6. typedef struct _OP {
  7.     float (*p_add)(float, float);
  8.     float (*p_sub)(float, float);
  9.     float (*p_mul)(float, float);
  10.     float (*p_div)(float, float);
  11. } OP;

  12. /****************************************
  13. * 加减乘除函数
  14. ***************************************/
  15. float ADD(float a, float b)
  16. {
  17.     return a + b;
  18. }

  19. float SUB(float a, float b)
  20. {
  21.     return a - b;
  22. }

  23. float MUL(float a, float b)
  24. {
  25.     return a * b;
  26. }

  27. float DIV(float a, float b)
  28. {
  29.     return a / b;
  30. }

  31. /****************************************
  32. * 初始化函数指针
  33. ***************************************/
  34. void init_op(OP *op)
  35. {
  36.     op->p_add = ADD;
  37.     op->p_sub = SUB;
  38.     op->p_mul = &MUL;
  39.     op->p_div = &DIV;
  40. }

  41. /****************************************
  42. * 库函数
  43. ***************************************/
  44. float add_sub_mul_div(float a, float b, float (*op_func)(float, float))
  45. {
  46.     return (*op_func)(a, b);
  47. }

  48. int main(int argc, char *argv[])
  49. {
  50.     OP *op = (OP *)malloc(sizeof(OP));
  51.     init_op(op);
  52.    
  53.     /* 直接使用函数指针调用函数 */
  54.     printf("ADD = %f, SUB = %f, MUL = %f, DIV = %f\n", (op->p_add)(1.3, 2.2), (*op->p_sub)(1.3, 2.2),
  55.             (op->p_mul)(1.3, 2.2), (*op->p_div)(1.3, 2.2));
  56.      
  57.     /* 调用回调函数 */
  58.     printf("ADD = %f, SUB = %f, MUL = %f, DIV = %f\n",
  59.             add_sub_mul_div(1.3, 2.2, ADD),
  60.             add_sub_mul_div(1.3, 2.2, SUB),
  61.             add_sub_mul_div(1.3, 2.2, MUL),
  62.             add_sub_mul_div(1.3, 2.2, DIV));

  63.     return 0;
  64. }


2、 回调函数实例(很有用)

一个GPRS模块联网的小项目,使用过的同学大概知道2G、4G、NB等模块要想实现无线联网功能都需要经历模块上电初始化、注册网络、查询网络信息质量、连接服务器等步骤,这里的的例子就是,利用一个状态机函数(根据不同状态依次调用不同实现方法的函数),通过回调函数的方式依次调用不同的函数,实现模块联网功能,如下:
  1. /*********  工作状态处理  *********/
  2. typedef struct
  3. {
  4. uint8_t mStatus;
  5. uint8_t (* Funtion)(void); //函数指针的形式
  6. } M26_WorkStatus_TypeDef;  //M26的工作状态集合调用函数


  7. /**********************************************
  8. ** >M26工作状态集合函数
  9. ***********************************************/
  10. M26_WorkStatus_TypeDef M26_WorkStatus_Tab[] =
  11. {   
  12.     {GPRS_NETWORK_CLOSE,  M26_PWRKEY_Off  }, //模块关机
  13.     {GPRS_NETWORK_OPEN,  M26_PWRKEY_On  }, //模块开机
  14.     {GPRS_NETWORK_Start,   M26_Work_Init  }, //管脚初始化
  15.     {GPRS_NETWORK_CONF,  M26_NET_Config  }, /AT指令配置
  16.     {GPRS_NETWORK_LINK_CTC,  M26_LINK_CTC  }, //连接调度中心  
  17.     {GPRS_NETWORK_WAIT_CTC, M26_WAIT_CTC  },  //等待调度中心回复
  18.     {GPRS_NETWORK_LINK_FEM, M26_LINK_FEM  }, //连接前置机
  19.     {GPRS_NETWORK_WAIT_FEM, M26_WAIT_FEM  }, //等待前置机回复
  20.     {GPRS_NETWORK_COMM,  M26_COMM   }, //正常工作   
  21.     {GPRS_NETWORK_WAIT_Sig,  M26_WAIT_Sig  },  //等待信号回复
  22.     {GPRS_NETWORK_GetSignal,  M26_GetSignal  }, //获取信号值
  23.     {GPRS_NETWORK_RESTART,  M26_RESET   }, //模块重启
  24. }
  25. /**********************************************
  26. ** >M26模块工作状态机,依次调用里面的12个函数   
  27. ***********************************************/
  28. uint8_t M26_WorkStatus_Call(uint8_t Start)
  29. {
  30.     uint8_t i = 0;
  31.     for(i = 0; i < 12; i++)
  32.     {
  33.         if(Start == M26_WorkStatus_Tab[i].mStatus)
  34.         {         
  35.       return M26_WorkStatus_Tab[i].Funtion();
  36.         }
  37.     }
  38.     return 0;
  39. }
szt1993 发表于 2024-4-10 14:25 | 显示全部楼层
两个回调函数的样例非常简捷适合新手进行了解
中国龙芯CDX 发表于 2024-4-10 16:00 | 显示全部楼层
GPRS模块联网的小项目很实用,大家可以借鉴一下
小夏天的大西瓜 发表于 2024-4-11 14:25 | 显示全部楼层
回调函数例子应用很适合新手进行学习
jf101 发表于 2024-4-14 14:39 | 显示全部楼层
回调函数例子应用很适合学习
小小蚂蚁举千斤 发表于 2024-4-15 09:59 | 显示全部楼层
回调函数例子应用适合项目开发实战
OKAKAKO 发表于 2024-4-19 18:45 | 显示全部楼层
回调函数例子非常适合新手进行学习
星辰大海不退缩 发表于 2024-4-21 12:22 | 显示全部楼层
第二个实例很容易适合新手项目开发
您需要登录后才可以回帖 登录 | 注册

本版积分规则

342

主题

2619

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部

342

主题

2619

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部