私はコマンドがユーザの入力の最初の文字に従って実行されるテキストエディタを作成しています。関数ポインタのジャンプテーブルは、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を使用することはできません。これを行うエレガントな方法はありますか?
あなたは(あなたが 'enum'を使用しようとしたときのように)いくつかのコードを提供してもらえますか? –
@Erik WIは、各文字を連続した整数にマップするためにこのようなことを試みました: 'en '{' r '、' w '、' t '、' \ n '};' '機能1には「w」、機能2には「t」、機能ポインタテーブルの機能3には「\ n」が含まれる。 – Derek
これはenumsの仕組みではありません。 'void(* fn [])(void)= {[ACTION_READFILE]]}これは、次のようになります:' enum Action {ACTION_READFILE = 'r'、ACTION_WRITEFILE = 'w'}; ' –