搜索
bottom↓
回复: 28

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

[复制链接]

出0入0汤圆

发表于 2008-3-4 18:24:33 | 显示全部楼层 |阅读模式
switch(flg)
{
    case flg1:
    {
        function1();
        break;
    }
    case flg2:
    {
        function2();
        break;
    }
  case flg3:
    {
        function3();
        break;
    }
    :
    :
    :
  case flgN:
    {
        functionN();
        break;
    }
    default:break;

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-3-4 18:28:16 | 显示全部楼层
有但我忘了在那看过了。

出0入0汤圆

发表于 2008-3-4 18:31:15 | 显示全部楼层
好象叫数组指针。

出0入0汤圆

发表于 2008-3-4 19:19:18 | 显示全部楼层
函数指针数组

出0入0汤圆

 楼主| 发表于 2008-3-4 19:21:21 | 显示全部楼层
好像跟指针函数,散转表之类相像的,但具体怎么实现我也忘记了,还望高手们指点迷真。。。。

出0入0汤圆

发表于 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[0]);++i)
   {
      if (fs.flag == flag)
      {
          fs.pfn();
          break;
       }
   }
}

出0入0汤圆

发表于 2008-3-4 20:40:36 | 显示全部楼层
为何是++i而不是i++?
知道了,没pfn0

出0入0汤圆

发表于 2008-3-4 20:51:42 | 显示全部楼层
五楼中的++i与i++得到的结果是一样的,它们的不同体现在赋值时,如i=1;a=++i;中a=2,i=2;在i=1;b=i++;中b=1;i=2;

出0入0汤圆

发表于 2008-3-4 21:08:30 | 显示全部楼层
++i和i++ 在这里是一样的,没有区别,只是我的编程习惯问题。

出0入0汤圆

 楼主| 发表于 2008-3-5 12:27:18 | 显示全部楼层
置顶通报表扬 shark

出0入0汤圆

发表于 2008-3-5 17:04:27 | 显示全部楼层
如果每个fun()的参数的类型和个数不一样这种方法是不是有问题呢??我觉得用函数指针对不带参数输入比较好,如果需要带参数的函数指针怎么弄??

出0入0汤圆

发表于 2008-3-5 19:00:10 | 显示全部楼层
回ls,函数指针可以定义为
void (*pfun)(void *pdata);
在函数的实现中用强制类型转换把指针转换为指向实际类型的指针。

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

出0入0汤圆

发表于 2008-3-6 03:18:59 | 显示全部楼层
如果像楼上说的那种情况,我觉得不适合用函数指针数组

出0入0汤圆

发表于 2008-3-6 09:22:10 | 显示全部楼层
函数指针数组了

出0入0汤圆

 楼主| 发表于 2008-3-9 21:20:00 | 显示全部楼层
再次置顶,期望新惊喜

出0入0汤圆

发表于 2008-3-10 08:52:03 | 显示全部楼层
函数参数个数不同, 我觉得还是11楼的方法可以, 想想 MFC里的windows事件处理函数全都是两个参数, 实际使用时还不是强制类型转换的, 所以这应该是个解决办法.

出0入0汤圆

发表于 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)
}

出0入0汤圆

 楼主| 发表于 2008-3-10 22:03:51 | 显示全部楼层
switch case
生成的代码是较长的吧

出0入0汤圆

发表于 2008-3-10 22:55:58 | 显示全部楼层
似乎和if else 一样代码长度,但可读性更好。

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

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

出0入0汤圆

发表于 2015-1-27 19:59:55 | 显示全部楼层
现在看这个帖子,回味无穷,学习了

出0入0汤圆

发表于 2015-1-27 20:11:52 | 显示全部楼层
flg1,flg2,——flgN  作为数组元素不就可以了吗

出0入0汤圆

发表于 2015-1-28 10:55:46 | 显示全部楼层
建议使用函数指针,个人感觉函数指针比较实用

出0入0汤圆

发表于 2015-1-28 10:59:51 | 显示全部楼层
有,回调函数,就是把每个需要执行的操作写成一个函数,把每个函数地址依次放入数组,然后调用

出0入0汤圆

发表于 2015-1-30 23:06:00 | 显示全部楼层
感觉又学到了一招

出0入0汤圆

发表于 2015-1-31 00:09:49 | 显示全部楼层
将你的函数做出数组列表,查表,直接调用函数指针执行。

出160入0汤圆

发表于 2015-2-1 02:22:31 | 显示全部楼层
今天晚上又学习到了新知识谢谢

出0入0汤圆

发表于 2015-2-10 19:25:21 | 显示全部楼层
这个帖子好早啊 不过还是学习了

出0入0汤圆

发表于 2015-2-11 22:43:01 | 显示全部楼层
又学习了一招

出0入0汤圆

发表于 2015-2-12 00:05:03 | 显示全部楼层
感谢,长姿势了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表