3

可変数のコマンド ライン引数を取る C プログラムを作成しています。次に、これらの引数を取得し、可変数のファイル名を個々のパラメーターとして受け取る関数に渡す必要があります (va_arg を使用して関数内の引数を取得します)。プロトタイプは次のとおりです。

void FindFile(char *filename1, ...);

私の FindFile の実装は問題ありません。私の質問は、メイン メソッドの 'char *argv[]' で可変数の引数を取得し、FindFile を呼び出すときにそれらをパラメーターとして使用するにはどうすればよいですか?

これはクラスの割り当てであるため、FindFile プロトタイプは変更できません。私はこれを機能させる方法を探しましたが、不可能であるという1つの答えしか見つかりませんでした。これは実際にそうですか?これは私の教授から与えられた正確な仕様なので、何とか可能だと思いましたが、正確な方法については授業で議論されませんでした。

4

2 に答える 2

2

私はポストスクリプトインタープリターでこのようなことをしました。

これは、私のオペレーター ハンドラー関数からのものです。switch ステートメントを使用して、関数ポインターを介して可変引数呼び出しを行います。

call: /* pass args bottom-up */
    tos = siq; /* pop the stack to the 'stack in question' */
    /* room for output? */
    if (tos-os + op.sig[i].out > OSSIZE) error(st,stackoverflow);
    switch (op.sig[i].n) {
        case 0: op.sig[i].fp(st); break;
        case 1: op.sig[i].fp(st, siq[0]); break;
        case 2: op.sig[i].fp(st, siq[0], siq[1]); break;
        case 3: op.sig[i].fp(st, siq[0], siq[1], siq[2]); break;
        case 4: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3]); break;
        case 5: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3], siq[4]); break;
        case 6: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3], siq[4], siq[5]); break;
        default: error(st,unregistered);
    }

このテクニックはGoswell インタープリター (別名 Rutherford インタープリター、別名 RALpage)から借りました。

于 2013-02-14T05:21:12.283 に答える
2

(少なくとも K&R、ansi-c、c99 では、実装に依存するトリックを除いて) 実行できないのは、選択したコマンドライン引数を実行時にある種の引数リストに追加し、それを関数に渡すことです。それが最初に頭に浮かぶので、残念です。

それはあなたの問題を、あなたが何ができるかを理解することの1つにします. たとえば、(指定された varidac 関数を)FindFile(fname, argc, argv);毎回呼び出すことができます。FindFile固定署名を与えるだけでなく、そのようなコードを書くのはばかげています (本当に、非常に、非常にばかげています) FindFile

コマンドライン引数の一部だけを渡したい場合は、必要char*[]なものだけを含む new を作成し、それを渡します。

于 2013-02-14T04:51:44.617 に答える