数组类型:
int a[n] -----------整型类型的数组
int *a[n] -----------指针类型的数组(指针数组)
void (*fun[n])(void)---------函数类型的数组(函数指针数组) //定义了N个函数指针元素的数组
在编写D12的控制程序时,遇到了一个数组结构的函数指针,于是我们几个人计论了大半天,最后终于搞懂它的奇妙所在。
现将对它的理解叙述于下:
首先,我们要明白如何定义一个函数指针数组。大家只要学过C的应该都能看懂下面一语句:
void fun(void);
那么由指针的定义可以得到下面一个变化的语句:
void (*fun)(void); // " * "先跟函数结合,说明它是一个指针,该指针指向函数fun,而且函数的输入,输出形参都是空。
我们知道一个数组的定义是这样: uchar aaa[n]; //含N个无符号字符形元素的数组aaa
而一个指针数组是: uchar *aaa[n]; //数组aaa中存放了N个批向无符号字符型的指针地址
于是我们就可以得出结论一个函数指针数组是这样定义: void (*fun[n]) (void) ;
//定义了N个函数指针元素的数组 而函数的输入输出形参都是空。
好。说了这么多的题外话,接下说进入主题:
在USB的标准请求中,包含了11种标准请求,而且它们都是用一个8位二进制数表示。
列表如下:
而我们在编写程序的时候要针对不同的请求调用不同的处理函数,我们可以用下面的方法来实现:
void request_fun(uchar bRequest)
{
switch bRequest
{ case 0:
GET_STATUS( ); break;
case 1:
CLEAR_FEATURE( ); break;
case 2:
RESERVED( ); break;
case 3:
SET_FEATURE( ); break;
case 4:
RESERVED( ); break;
case 5:
..............
..............
..............
}
}
而现在我们也可以简单地用函数指针数组来实现:
先定义如下数组:
void (*request[]) (void)={
GET_STATUS // 0
CLEAR_FEATURE // 1
RESERVED // 2
SET_FEATURE // 3
RESERVED // 4
SET_ADDRESS // 5
GET_DESCRIPTOR // 6
SET_DESCRIPTOR // 7
GET_CONFIGURATION // 8
SET_CONFIGURATION // 9
GET_INTERFACE // 10
SET_INTERFACE // 11
SYSNCH_FRAME // 12
}
在程序中调用:
void ( *request[ bRequest ] ) (void);
小结:当我们需要处理多个相类同的任务时,特别一任务比较多如:针对256个不同的情况进行不同的处理。就可以使用函数指针数组来实现。这样不单比使用switch语句简结,而且可能运行速率也比较高。