mystudy 发表于 2008-3-4 18:24:33

新手问:有没可以替换的方法,关于switch-------case

switch(flg)
{
    case flg1:
    {
      function1();
      break;
    }
    case flg2:
    {
      function2();
      break;
    }
case flg3:
    {
      function3();
      break;
    }
    :
    :
    :
case flgN:
    {
      functionN();
      break;
    }
    default:break;

}
请问这种情况,当flgN数目很多时,有没其他方法代替?

hemjidn 发表于 2008-3-4 18:28:16

有但我忘了在那看过了。

hemjidn 发表于 2008-3-4 18:31:15

好象叫数组指针。

ghost2 发表于 2008-3-4 19:19:18

函数指针数组

mystudy 发表于 2008-3-4 19:21:21

好像跟指针函数,散转表之类相像的,但具体怎么实现我也忘记了,还望高手们指点迷真。。。。

shark 发表于 2008-3-4 20:34:39

struct {
   int   flag;
   void (*pfn)();
} fs[]={
   {1,fun1},
   {2,fun2},
   ...
};
程序:

void RunByFlag(int flag)
{
   int i;
   for(i=0;i<sizeof(fs)/sizeof(fs);++i)
   {
      if (fs.flag == flag)
      {
          fs.pfn();
          break;
       }
   }
}

hemjidn 发表于 2008-3-4 20:40:36

为何是++i而不是i++?
知道了,没pfn0

flyun 发表于 2008-3-4 20:51:42

五楼中的++i与i++得到的结果是一样的,它们的不同体现在赋值时,如i=1;a=++i;中a=2,i=2;在i=1;b=i++;中b=1;i=2;

shark 发表于 2008-3-4 21:08:30

++i和i++ 在这里是一样的,没有区别,只是我的编程习惯问题。

mystudy 发表于 2008-3-5 12:27:18

置顶通报表扬 shark

redsnow 发表于 2008-3-5 17:04:27

如果每个fun()的参数的类型和个数不一样这种方法是不是有问题呢??我觉得用函数指针对不带参数输入比较好,如果需要带参数的函数指针怎么弄??

ifree64 发表于 2008-3-5 19:00:10

回ls,函数指针可以定义为
void (*pfun)(void *pdata);
在函数的实现中用强制类型转换把指针转换为指向实际类型的指针。

但个人感觉要是一个程序中到处都是强制类型转换的话,程序的风格就太差了。

shark 发表于 2008-3-6 03:18:59

如果像楼上说的那种情况,我觉得不适合用函数指针数组

Feeling_MCU 发表于 2008-3-6 09:22:10

函数指针数组了

mystudy 发表于 2008-3-9 21:20:00

再次置顶,期望新惊喜

nicksean 发表于 2008-3-10 08:52:03

函数参数个数不同, 我觉得还是11楼的方法可以, 想想 MFC里的windows事件处理函数全都是两个参数, 实际使用时还不是强制类型转换的, 所以这应该是个解决办法.

rainyss 发表于 2008-3-10 21:34:08

switch case是最好的选择,因为它编译出来的散列表,代码短,速度快.
如果你觉得只是书写太麻烦,可以用#define,它能做到的事比你想象的多多了

#define DEFINE_FN(f,F) case f:{F();break;}

...

switch (flag){
DEFINE_FN(flag1,function1)
DEFINE_FN(flag2,function2)
DEFINE_FN(flag3,function3)
}

mystudy 发表于 2008-3-10 22:03:51

switch case
生成的代码是较长的吧

mljda 发表于 2008-3-10 22:55:58

似乎和if else 一样代码长度,但可读性更好。

如果各个程序块比较大,用程序指针要合理些。排版更紧密更可读。

可读性是高级语言的一大重点。

lovecxm 发表于 2015-1-27 19:59:55

现在看这个帖子,回味无穷,学习了

lonely9391 发表于 2015-1-27 20:11:52

flg1,flg2,——flgN作为数组元素不就可以了吗

fengyuganyu 发表于 2015-1-28 10:55:46

建议使用函数指针,个人感觉函数指针比较实用

cnxh 发表于 2015-1-28 10:59:51

有,回调函数,就是把每个需要执行的操作写成一个函数,把每个函数地址依次放入数组,然后调用

jqbkl007 发表于 2015-1-30 23:06:00

感觉又学到了一招

34071417 发表于 2015-1-31 00:09:49

将你的函数做出数组列表,查表,直接调用函数指针执行。

261854681 发表于 2015-2-1 02:22:31

今天晚上又学习到了新知识谢谢

pop_wu 发表于 2015-2-10 19:25:21

这个帖子好早啊 不过还是学习了

dmzy 发表于 2015-2-11 22:43:01

又学习了一招

kk2008 发表于 2015-2-12 00:05:03

感谢,长姿势了
页: [1]
查看完整版本: 新手问:有没可以替换的方法,关于switch-------case