标题: 无意中看到的一段代码 [打印本页]

作者: liuyang    时间: 2012-1-3 23:20
标题: 无意中看到的一段代码
void CmdRunning()

2   {

3       int iCmdNum = 0;               

4       void (*pCmd)() = NULL;

5          

6       do{

7             pCmd = NULL;

8             printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\n");

9             iCmdNum = getchar();

10            fflush(stdin);

11            switch(iCmdNum){

12              case '0':

13                        printf("谢谢使用,再见!\n");

14                        break;

15              case '1':

16                       pCmd = CreateFile;

17                       break;

18              case '2':

19                       pCmd = OpenFile;

20                       break;

21              case '3':

22                       pCmd = SaveFile;

23                       break;

24              default:

25                       printf("对不起,你选择的数字不存在,请重新选择!\n");

26              }

27              if (NULL != pCmd){

28                 pCmd();                                          // 与“(*pCmd)();”等价

29              }

30        }while('0' != iCmdNum);

31    }

这种方式代码虽然简洁,但是这种形式的扩展性很差。

 

struct myNode
{
    char cmdNum;            //编号 
    void (*pCmdFun)(void);    //存储函数地址用的函数指针 
};


//此处省略 ExitAll、CreatFile、OpenFile、Savefile函数实体的内容。 


//下面是“字典” 
struct myNode Cmd[]=
{
    {'0' , ExitAll    },    //这是一条记录,内容为:编号 函数首地址。 
    {'1' , CreatFile},    //这是一条记录,内容为:编号 函数首地址。 
    {'2' , OpenFile    },
    {'3' , SaveFile    }
    //以后如果要增加新的功能,只需在此增加一条“记录”即可,格式同上。(扩展性非常高!)
};


const int Length_Of_Cmd = sizeof(Cmd)/sizeof(Cmd[1]);//自动测量结构体数组的大小(字典有多少条记录) 




void cmdRuning()
{
    char cmdNum_input;
    int n=0;
    
    printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\n");
    cmdNum_input = getchar();
    fflush(stdin);


     n = (cmdNum_input - '0');
       if( n>0 && n<(sizeof(Cmd) / sizeof(Cmd[0]) ) )//数据边界检查
        {// 直接映射到回调函数
            Cmd[n].pCmdFun();//本句执行字典中跟输入的选项对应的函数
        }
}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1