0

我需要你的帮助来编写一个高效的程序。

我有大约 50 个功能说call_1()call_2()...。call_50()我需要根据从数据包中读取的索引来调用它们,即如果 data 中的字段是 25 in need to call call_25(),如果是 10 then call_10()

我已经在 if else 条件下写了这个

if (index == 5) 
    call_5() 
elseif (index == 6)
   ..so on .. 

但我认为这不是有效的写作方式。实施此方案的任何其他想法?函数指针在这里有帮助吗?感谢你的帮助。谢谢。

4

6 回答 6

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]();
}
于 2012-08-20T14:29:08.880 回答
1

如果所有 50 个函数的参数都相同,请使用函数指针数组:

typedef void (*FieldHandler)(void);

const FieldHandler handlers[50] = { call_0, call_1, /* ... and so on ... */ };

然后你只需索引数组并调用:

handlers[index]();
于 2012-08-20T14:28:31.327 回答
1

如果您的所有函数都具有相同的签名,您可以在那里轻松地使用函数指针数组。

typedef void (*func)(void);
...
func dispatch_table[] = {
   func0,
   func1,
   func2,
...
   func50,
};

后来像这样使用

int function_index = packet_get_func_index( packet );
...
dispatch_table[ function_index ]();
于 2012-08-20T14:28:53.807 回答
0

是的,函数指针是通往这里的路。

我建议创建一个函数指针表,因为你的输入是一个索引,你只需索引表来调用正确的函数。

于 2012-08-20T14:29:20.547 回答
0

我会使用 switch 语句:

switch(index) {
  case 1: return call01();
  case 2: return call02();
  case 3: return call03();
}

这并不比使用函数指针多多少代码,而且(恕我直言)更简洁。

于 2012-08-20T14:29:37.597 回答
0

是的,这是非常低效的。我认为最好的方法是在 0 - 255 的范围内编写这种形式的调度程序:

无效(*调度程序[255]);

当然,您需要分配所有必要的函数而不是执行 if 语句,但这会快得多:

dispatcher['a'] = &call_1;
dispatcher['b'] = &call_2;
dispatcher['c'] = &call_3;
...

然后你可以这样做:

dispatcher(index) 并且它会知道要执行哪个函数。

希望有帮助。

于 2012-08-20T14:32:30.143 回答