我需要你帮助写一个有效的程序。
我有大约50个函数说call_1()
,call_2()
... call_50()
。我需要根据从数据包中读取的索引来调用它们,即数据中的字段是否需要调用call_25()
,如果是10那么call_10()
。
我已将此写入if if条件,如
if (index == 5)
call_5()
elseif (index == 6)
..so on ..
但我认为这不是有效的写作方式。实现这种情况的任何其他想法? 函数指针可以帮助吗? 感谢您的帮助。感谢。
答案 0 :(得分:6)
是的,使用函数指针的查找表:
typedef void(*fp)(void);
void call_01(void);
void call_02(void);
/* ... */
fp functions[] = { &call_01,
&call_02,
/* ... */
};
void call()
{
unsigned int n = get_index();
functions[n]();
}
答案 1 :(得分:1)
如果所有50个函数的参数相同,请使用函数指针数组:
typedef void (*FieldHandler)(void);
const FieldHandler handlers[50] = { call_0, call_1, /* ... and so on ... */ };
然后你只需索引数组并调用:
handlers[index]();
答案 2 :(得分:1)
如果所有函数都具有相同的签名,则可以轻松使用函数指针数组。
typedef void (*func)(void);
...
func dispatch_table[] = {
func0,
func1,
func2,
...
func50,
};
后来像这样使用
int function_index = packet_get_func_index( packet );
...
dispatch_table[ function_index ]();
答案 3 :(得分:0)
是的,函数指针是这里的方法。
我建议创建一个函数指针表,因为你的输入是一个索引,你只需索引到表中调用正确的函数。
答案 4 :(得分:0)
我使用switch语句:
switch(index) {
case 1: return call01();
case 2: return call02();
case 3: return call03();
}
这不是使用函数指针的代码,而且(imho)更简洁。
答案 5 :(得分:0)
是的,这效率很低。我认为最好的方法是编写一个这种形式的调度程序,范围为0 - 255:
void(* dispatcher [255]);
当然,您需要分配所有必要的函数而不是if语句,但这会更快:
dispatcher['a'] = &call_1;
dispatcher['b'] = &call_2;
dispatcher['c'] = &call_3;
...
然后你可以这样做:
调度程序(索引),它将知道要执行的函数。
希望有所帮助。