2017-05-14 7 views
2

私はコマンドがユーザの入力の最初の文字に従って実行されるテキストエディタを作成しています。関数ポインタのジャンプテーブルは、charによってインデックスされています

たとえば、ユーザがr filename.fooと入力すると、文字rがread_file()関数の呼び出しに使用されます。これを行う明白な方法は、switch(buf[0])を使用することですが、関数ポインタの配列を使用したいので、長いswitchステートメントを書き出す代わりに(*fn[buf[0])と言うことができます。 (このデザインパターンにさらに明確にするために、カーニハンとパイクの「プログラミングの実践」のページ221を参照。)

iは整数で各文字を関連付けるenumを使用してみました、enum { 'r', 'w', 't', '\n' };とR「」をマッピングすることになりますint 0、 'w'をint 1に、 't'をint 2に、 '\ n'をint 3に変換しますが、Cではcharを使用することはできません。これを行うエレガントな方法はありますか?

+0

あなたは(あなたが 'enum'を使用しようとしたときのように)いくつかのコードを提供してもらえますか? –

+0

@Erik WIは、各文字を連続した整数にマップするためにこのようなことを試みました: 'en '{' r '、' w '、' t '、' \ n '};' '機能1には「w」、機能2には「t」、機能ポインタテーブルの機能3には「\ n」が含まれる。 – Derek

+0

これはenumsの仕組みではありません。 'void(* fn [])(void)= {[ACTION_READFILE]]}これは、次のようになります:' enum Action {ACTION_READFILE = 'r'、ACTION_WRITEFILE = 'w'}; ' –

答えて

2

これを行うための適切な方法は、指定されたイニシャライザを使用することです。

#include <stdio.h> 

void read(void) 
{ 
    puts("read"); 
} 

void write(void) 
{ 
    puts("write"); 
} 

typedef void (*function_map_t)(void); 

function_map_t function_map[] = { 
    ['r'] = read, 
    ['w'] = write, 
}; 

配列のサイズを固定する場合は、function_map [255]を使用します。すべての不足しているエントリは、標準によって要求されるようにゼロで初期化されます。

https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

関連する問題