0

効率的なプログラムを書くためにあなたの助けが必要です。

私は約50の機能を持ってcall_1()いますcall_2().... call_50()データパケットから読み取ったインデックスに基づいてそれらを呼び出す必要があります。つまり、データのフィールドが 25 の場合は を呼び出す必要がありcall_25()、10 の場合は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

ええ、それはかなり非効率的です。続行するための最良の方法は、0〜255の範囲でこの形式のディスパッチャーを作成することだと思います。

void(* dispatcher [255]);

もちろん、ifステートメントを実行する代わりに、必要なすべての関数を割り当てる必要がありますが、これは非常に高速です。

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

次に、次のことを実行できます。

ディスパッチャ(インデックス)とそれは実行する関数を知っているでしょう。

お役に立てば幸いです。

于 2012-08-20T14:32:30.143 に答える
0

はい、関数ポインターはここに行く方法です。

関数ポインターのテーブルを作成することをお勧めします。入力はインデックスであるため、テーブルにインデックスを付けて適切な関数を呼び出すだけです。

于 2012-08-20T14:29:20.547 に答える
0

switch ステートメントを使用します。

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

これは、関数ポインターを使用するよりも多くのコードではなく、(imho) より簡潔です。

于 2012-08-20T14:29:37.597 に答える