lyf9908 发表于 2011-1-3 21:17

怎样解读这几行代码。

最近看一个资深工程师写的代码,如下几行

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

这第一行这样作类型定义有什么作用?
   这最后一行到底在干啥?
着实看不懂啊,请高手帮忙解析下,谢谢!

清风一士 发表于 2011-1-3 21:26

执行一个函数表中某一个元素(函数,原型即void (*fptr)();)

lyf9908 发表于 2011-1-4 16:23

还是不大明白,原来搞硬件的,现在想搞软件,举步维艰啦,问题太多了。
   完整的如下:
   
#defineinpw(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; /* Interrupt Handler Table */
3: irqNum = inpw(AIC_ISNR);/* read the interrupt source number */
4: (*IRQ_HandlerTable)();
请高手帮忙解答下,谢谢!

liang7143 发表于 2011-1-6 09:55

1、定义一个类型的别名,这个类型为 函数指针
和如下这样的定义其实是一样的
typedef unsigned char uint8
2、定义了一个 函数指针数组 这个数组里面包含了19个 无返回值 无参数的函数指针
4、调用对应的函数(假如irqNum为0,是调用IRQ_HandlerTable中对应的函数)

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++的函数指针 及类型定义的综合使用
页: [1]
查看完整版本: 怎样解读这几行代码。