怎样解读这几行代码。

[复制链接]
3851|15
 楼主| lyf9908 发表于 2011-1-3 21:17 | 显示全部楼层 |阅读模式
最近看一个资深工程师写的代码,如下几行

1:  typedef void (*fptr)();    /* function pointer */
2: fptr IRQ_HandlerTable[19]; /* Interrupt Handler Table */
3: irqNum = inpw(AIC_ISNR);  /* read the interrupt source number */
4: (*IRQ_HandlerTable[irqNum])();

  这第一行这样作类型定义有什么作用?
   这最后一行到底在干啥?
  着实看不懂啊,请高手帮忙解析下,谢谢!
清风一士 发表于 2011-1-3 21:26 | 显示全部楼层
执行一个函数表中某一个元素(函数,原型即void (*fptr)();)
 楼主| lyf9908 发表于 2011-1-4 16:23 | 显示全部楼层
还是不大明白,原来搞硬件的,现在想搞软件,举步维艰啦,问题太多了。
   完整的如下:
   
  #define  inpw(port)         port
   #define AIC_ISNR    (VPint(APB_IO_BASE+0x2110)) /* Interrupt Source Number Register */
   uint32    irqNum;
1: typedef void (*fptr)();    /* function pointer */
2: fptr IRQ_HandlerTable[19]; /* Interrupt Handler Table */
3: irqNum = inpw(AIC_ISNR);  /* read the interrupt source number */
4: (*IRQ_HandlerTable[irqNum])();
  请高手帮忙解答下,谢谢!
liang7143 发表于 2011-1-6 09:55 | 显示全部楼层
1、定义一个类型的别名,这个类型为 函数指针
和如下这样的定义其实是一样的
typedef unsigned char uint8
2、定义了一个 函数指针数组 这个数组里面包含了19个 无返回值 无参数的函数指针
4、调用对应的函数(假如irqNum为0,是调用IRQ_HandlerTable[0]中对应的函数)
liang7143 发表于 2011-1-6 09:57 | 显示全部楼层
其实就是 一个 转移表的应用
e掾木 发表于 2011-1-6 20:33 | 显示全部楼层
这样的设计方式确实让人如坠五云中!没有5年的C设计功底,建议绕过。
喜欢这样设计的高手无外乎是以下几种情况:
1、做项目外包;2、对项目组不满,做完项目就想走人;3、商业代码。
mohanwei 发表于 2011-1-6 20:42 | 显示全部楼层
也没那么夸张,启动代码、RTOS、菜单、Shell、算法里很常见……因为不这样用程序没法写:lol
如果不信邪,也可以自己找个例子,然后尝试做一下,呵呵
 楼主| lyf9908 发表于 2011-1-6 20:59 | 显示全部楼层
多谢谢,学了!
   总结下:
    1:定义fptr为一个指针变量,指向一个没有返回值的函数。
    2:定义一个指针数组,每一个元系都为一个指向没有返回值的函数的指针变量。
    3:这条干嘛不直接写成:irqNum = AIC_ISNR? 写成哪样有什么好处?
    4:调用对应的函数。
清风一士 发表于 2011-1-6 22:48 | 显示全部楼层
楼主C功需再练
xixihaha0 发表于 2011-1-7 17:03 | 显示全部楼层
这个很简单吧,c功底,还没涉及到复杂的算法,哈哈,
 楼主| lyf9908 发表于 2011-1-8 19:01 | 显示全部楼层
以前搞硬件的,只写过单片机程序,现在都30岁了,才想到要把软件搞深点,实时操作系统都要干,不然没有竞争力呀。‘
   雄关漫道真如铁!
rr_tm_520 发表于 2011-1-8 23:55 | 显示全部楼层
呵呵,主要对是C的指针要了解透彻
ASCLL 发表于 2011-5-9 13:33 | 显示全部楼层
LZ加群30803350讨论
生化分析仪 发表于 2011-5-16 11:42 | 显示全部楼层
绝对是需要人来搞的
wxwangwei 发表于 2011-5-18 13:22 | 显示全部楼层
领教了
a2b3c4ddd 发表于 2011-5-23 23:24 | 显示全部楼层
这是C/C++的函数指针 及类型定义的综合使用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

176

帖子

0

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