OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8045|回复: 5

要用函数直接调用就好啦。为什么还要用指针

[复制链接]

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
发表于 2014-10-17 10:44:16 | 显示全部楼层 |阅读模式
5金钱
函数指针的概念我知道。我问的就是:要用什么函数直接写到哪儿就行了。干嘛非要用函数指针往过指啊,能举个例子吗?请别回复什么:方便。。。高效。。我就想认认真真明白用函数指针的好处。函数指针初始化要注册指向A函数。那么之后他肯定地址就不变了。如果某些情况出发比如IF(a==1){我把函数指针重新注册成B函数};这我直接判定如果a==1;那么我就执行B函数不一样方便吗?我实在是不懂LINUX的一大堆回调。求指点

最佳答案

查看完整内容[请看2#楼]

/* 数据结构 */ typedef struct _Protocal_Callbacks{ BOOL (*pPackage_Check)(u8 *pdata, u16 len); /* 数据包地址域、接口类型、校验确认 */ BOOL (*pSet_Addr)(u8 addr); /* 设置设备地址 */ BOOL (*pSet_BPS)(u8 bps); /* 设置波特率 */ BOOL (*pSet_Dot_Group)(u8 *pdata, u8 len); /* 测温点分组配置 */ BOOL (*pSet_Time)(u8 *pdata, u8 len); ...
具有资深STM32点灯技术,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-10-17 10:44:17 | 显示全部楼层
/* 数据结构 */
typedef struct _Protocal_Callbacks{
    BOOL (*pPackage_Check)(u8 *pdata, u16 len);  /* 数据包地址域、接口类型、校验确认 */
    BOOL (*pSet_Addr)(u8 addr);                   /* 设置设备地址 */
    BOOL (*pSet_BPS)(u8 bps);                     /* 设置波特率 */
    BOOL (*pSet_Dot_Group)(u8 *pdata, u8 len);   /* 测温点分组配置 */
    BOOL (*pSet_Time)(u8 *pdata, u8 len);         /* 设置时间 */
    BOOL (*pSet_OverTem)(u8 group, s16 tem);                /* 设置过温阈值 */
    BOOL (*pSet_Font)(u8 group, u8 dot, u8 num, u8 *pdata, u8 len);  /* 设置字模 */
    BOOL (*pSet_Tem_Y)(s16 tem);          /* 设置Y轴标度 */
    BOOL (*pRead_Addr)(void);             /* 读地址 */
    BOOL (*pRead_BPS)(void);              /* 读波特率 */
    BOOL (*pRead_Dot_Group)(void);       /* 读分组信息 */
    BOOL (*pRead_OverTem)(void);         /* 读过温阈值 */
    BOOL (*pRead_Version)(void);         /* 读软件版本 */
    BOOL (*pSet_433M_Frq)(u8 frq);       /* 设置433M频点 */
    BOOL (*pSet_Pan_ID)(u16 panid);      /* 设置PanID */
    BOOL (*pRestart_System)(void);       /* 重启设备 */
    BOOL (*pSet_IP_Imf)(u8 *pdata, u8 len);     /* 设置IP信息 */
    BOOL (*pEnd)(void);                   /* 触发包发送 */
    void (*pNULL_Fun)(u8 code);           /* 不支持此选项码 */
    void (*pData_Err)(void);              /* 造成溢出的错误 */
}CB_Typdef;[/mw_shl_code]
举例。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

1

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-12
在线时间
9 小时
发表于 2014-10-17 10:44:17 | 显示全部楼层
1.可以用在转移表快速处理分支
处理分支,一般的做法是
if(vlue == 0)
{
    fun0();
}
else if(value == 1)
{
   fun1();
}
...
else if(value == 199)
{
  fun199();
}
假如有200个分支,岂不是要判断200次(耗时,而且看着不舒服)。

这时候就可以用函数指针做成数组
const void (* handle[200])(void) = 
{
     fun0,
     fun1,
    ...
    fun199
}

然后处理的时候,直接这么做就可以了:
handle[value]();//通过value的值快速取得分支函数。

2.可以用作回调函数
比方说,我跟你合作,我写驱动模块,你写应用层,我现在写了个按键扫描函数,你希望监听按键事件但不关心按键是怎么扫描的,
你只需注册回调函数,每次有事件发生就会调用你注册的回调函数进行处理:
void RegisterKeyEventCB(void EventCB(* KeyEvent_t));
{
   if(EventCB)
   KeyEventCB = EventCB; 
}
3.当然还有其他作用。慢慢积累吧
功夫再高、也怕羊刀
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-17 12:45:09 | 显示全部楼层
这个貌似内核很多。应用没用过。帮顶。。。
小小蜗牛
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-10-17 13:10:02 | 显示全部楼层
这样便于模块化。。。。有的模块式动态加载的
目前在玩STM32,BBB,RPi
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2014-10-17 16:55:36 | 显示全部楼层
就像楼上所说   当模块化编程的时候 

写回掉函数的时候   

你去改人家源代码?
学无止境
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表