1

それで、私は Unix のミニシェルを作っていて、障害になっています。組み込み関数を実行できるようにする必要があるため、関数を作成しました。

int exec_if_built_in(char **args)

文字列の配列を取ります (最初はコマンドで、残りは引数です)。非組み込みコマンドの場合は、execvp などを使用するだけですが、最初の文字列を関数にマップする方法を見つける必要があります。1 つは文字列、もう 1 つは対応する関数ポインターの 2 つの配列を作成することを考えていました。ただし、これらの関数の多くは異なるため (異なるものを返し、受け入れる)、このアプローチは機能しません。名前プロパティと関数ポインタ プロパティを持つ構造体の配列を作成することも考えましたが、使用する関数の性質がさまざまであるため、これは機能しません。

では、文字列の入力に基づいて関数を実行する最良の方法は何でしょうか? 文字列を特定の関数にマップするにはどうすればよいですか? 私は関数ポインタにあまり詳しくないので、何かが欠けているかもしれません。

皆さん、助けてくれてありがとう:)

4

2 に答える 2

3

1 つは文字列、もう 1 つは対応する関数ポインターの 2 つの配列を作成することを考えていました。

それが正しいアプローチです。同じ型*の引数を取るラッパー関数を作成し、ラッパー内から「実際の」関数を呼び出します。

「スタイルの追加ポイントを獲得したい」場合は、文字列の配列をアルファベット順に並べ替え、文字列の配列でバイナリ検索を使用します。これにより、2 つの配列が大きくなったときに CPU サイクルを節約できます。


*おそらく、 を使用できます。char **それが必要だからですexec_if_built_in

于 2012-10-07T03:35:28.970 に答える
1

ケースが非常に多様で、テーブル駆動型のアプローチが不適切な場合は、おそらく if/else-if カスケードが最適なソリューションです。

if(!strcmp(args[0], "cat")) {
    /* cat a file */
} else if(!strcmp(args[0], "dog")) {
    /* dog a file */
} else if(!strcmp(args[0], "echo")) {
    /* create an echo chamber */
} ...
于 2012-10-07T03:33:17.553 に答える