gdszyj 发表于 2011-9-22 08:00:41

一个看不懂的数组

//*#define USB_EP_EVENT   0x0003*/
//*USB_Endpoint##n is like USB_Endpoint1(the 1 is just n parameter)*/
#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)

/* USB Endpoint Events Callback Pointers */
void (* const USB_P_EP) (DWORD event) = {
P_EP(0),
P_EP(1),
P_EP(2),
P_EP(3),
P_EP(4),
P_EP(5),
P_EP(6),
P_EP(7),
P_EP(8),
P_EP(9),
P_EP(10),
P_EP(11),
P_EP(12),
P_EP(13),
P_EP(14),
P_EP(15),
};
这是一个什么样的数组呢?为什么在定义的数组名称以后还有一个 (DWORD event) 的修饰呢?还请知道的人给讲解讲解。
LPC2148_USB_HID程序,上面的数组只是其中的一段ourdev_678654J8Z1HC.rar(文件大小:206K) (原文件名:USBHID.rar)

liangyurongde 发表于 2011-9-22 08:08:03

回复【楼主位】gdszyj
-----------------------------------------------------------------------

应该是一个函数型的数组,void (* const ) (DWORD event) 部份是函数型的修饰,USB_P_EP是数组名。

gdszyj 发表于 2011-9-22 08:16:47

回复【1楼】liangyurongde
-----------------------------------------------------------------------

能看的出来USB_P_EP是一个数组名称,USB_P_EP里面刚好包含了16个P_EP(n),同时要说明的是P_EP(n)的内容都是字符串,通过宏定义展开以后,P_EP(0)变为USB_EndPoint1。

hitlfba11 发表于 2011-9-22 08:30:02

是函数数组(DWORD event)是函数的参数

ufbycd 发表于 2011-9-22 10:33:28

大家都没有看到 P_EP() 是一个带参数宏吗!
感觉这样使用有点别扭。将一个带参数宏当作当作一般函数来调用,不知形参会怎么分配,函数怎么退出?
----------------------------------------
哦,我想明白了。宏展开的就是一个函数。
如:P_EP(0) 展开为 USB_EndPoint1, 而USB_EndPoint1的函数原型为
void USB_EndPoint1 (DWORD event);

这技巧还不错。
但这里有个问题,当宏展开为NULL时,在没有MMU的机器调用NULL函数会使系统复位。

hitlfba11 发表于 2011-9-22 10:46:01

是有点别扭
USB_EP_EVENT & (1 << (3))如果是真,调用(*USB_P_EP )(DWORD event)相当于调用(*P_EP(3))(DWORD event)
相当于USB_EndPoint3(DWORD event) 否则是NULL

ufbycd 发表于 2011-9-22 10:55:05

回复【5楼】hitlfba11
是有点别扭
usb_ep_event & (1 << (3))如果是真,调用(*usb_p_ep )(dword event)相当于调用(*p_ep(3))(dword event)
相当于usb_endpoint3(dword event) 否则是null
-----------------------------------------------------------------------
在没有MMU的机器调用NULL函数是否会使系统复位?即便不复位,是否也会发生异常?
或者在调用此数组的函数前必须要检测是否为NULL?

hitlfba11 发表于 2011-9-22 11:00:50

回复【6楼】ufbycd
回复【5楼】hitlfba11
是有点别扭
usb_ep_event &amp; (1 &lt;&lt; (3))如果是真,调用(*usb_p_ep )(dword event)相当于调用(*p_ep(3))(dword event)
相当于usb_endpoint3(dword event) 否则是null
-----------------------------------------------------------------------
在没有mmu的机器调用null函数是否会使系统复位?
或者在调用此数组的函数前必须要检测是否为null?

-----------------------------------------------------------------------

这是在预处理的时候确定的,null就是什么都不执行,跳过去了

ufbycd 发表于 2011-9-22 11:32:18

回复【7楼】hitlfba11
这是在预处理的时候确定的,null就是什么都不执......
-----------------------------------------------------------------------
不对呀,这里是函数指针等于NULL,而NULL代表的地址为0,即此函数的地址为0.调用此函数也就是跳转到0地址执行。
在一些MCU中就是用这样的函数指针来实现软件复位的。
而我在PIC24系列的MCU中调用这样的函数指针确实就复位了。
页: [1]
查看完整版本: 一个看不懂的数组