新手问:有没可以替换的方法,关于switch-------case
switch(flg){
case flg1:
{
function1();
break;
}
case flg2:
{
function2();
break;
}
case flg3:
{
function3();
break;
}
:
:
:
case flgN:
{
functionN();
break;
}
default:break;
}
请问这种情况,当flgN数目很多时,有没其他方法代替? 有但我忘了在那看过了。 好象叫数组指针。 函数指针数组 好像跟指针函数,散转表之类相像的,但具体怎么实现我也忘记了,还望高手们指点迷真。。。。 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;
}
}
} 为何是++i而不是i++?
知道了,没pfn0 五楼中的++i与i++得到的结果是一样的,它们的不同体现在赋值时,如i=1;a=++i;中a=2,i=2;在i=1;b=i++;中b=1;i=2; ++i和i++ 在这里是一样的,没有区别,只是我的编程习惯问题。 置顶通报表扬 shark 如果每个fun()的参数的类型和个数不一样这种方法是不是有问题呢??我觉得用函数指针对不带参数输入比较好,如果需要带参数的函数指针怎么弄?? 回ls,函数指针可以定义为
void (*pfun)(void *pdata);
在函数的实现中用强制类型转换把指针转换为指向实际类型的指针。
但个人感觉要是一个程序中到处都是强制类型转换的话,程序的风格就太差了。 如果像楼上说的那种情况,我觉得不适合用函数指针数组 函数指针数组了 再次置顶,期望新惊喜 函数参数个数不同, 我觉得还是11楼的方法可以, 想想 MFC里的windows事件处理函数全都是两个参数, 实际使用时还不是强制类型转换的, 所以这应该是个解决办法. 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)
} switch case
生成的代码是较长的吧 似乎和if else 一样代码长度,但可读性更好。
如果各个程序块比较大,用程序指针要合理些。排版更紧密更可读。
可读性是高级语言的一大重点。 现在看这个帖子,回味无穷,学习了 flg1,flg2,——flgN作为数组元素不就可以了吗 建议使用函数指针,个人感觉函数指针比较实用 有,回调函数,就是把每个需要执行的操作写成一个函数,把每个函数地址依次放入数组,然后调用 感觉又学到了一招 将你的函数做出数组列表,查表,直接调用函数指针执行。 今天晚上又学习到了新知识谢谢 这个帖子好早啊 不过还是学习了 又学习了一招 感谢,长姿势了
页:
[1]