函数指针数组

数组类型:

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位二进制数表示。

列表如下:

bRequest                        value

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_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语句简结,而且可能运行速率也比较高。

一见钟情 发表于09-08 13:59 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

一见钟情
一见钟情(大校)
金币:1529个|学分:3659个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号