0

抽象データ型のインスタンスを作成する必要がありますが、インスタンスの作成にはいくつかのパラメーターが必要です。では、これらのパラメータを関数に渡すにはどうすればよいでしょうか? 多くのパラメーターがあり、それらのほとんどをデフォルト値にしたいと思っています。これを解決する方法はいくつかありますが、どれが最適かを判断することはできません。

最初のオプション:

MyADT_t *my_adt_create( const char* a_long_config_string);

..次a_long_config_stringのような文字列はどこにありますか"param1=value;param2=value"

これは魅力的ですが、関数内で文字列の乱雑な解析 (およびエラー チェック) が行われると思います。

2 番目のオプション:

MyADT_t *my_adt_create( int paramc, char *paramv[]);

これはコマンド ライン入力スタイルmain(int argc, char *argv[])を模倣しており、getopt や popt などのコマンド ライン オプション ライブラリを使用して実装できます。

3 番目のオプション:

次のような可変関数を使用します。 MyADT_t *my_adt_create( int mandatory_param, ...);

..そして、関数内でパラメーターと値のペアでパラメーターを読み取ります。2番目のオプションと大差ないかもしれませんが、それでも違います。

追加情報:ファクトリ メソッドのパラメーターの一部は、コマンド ライン オプションから提供されると思います。これにより、選択が簡単になりますか?

編集
して明確にする:プログラムを次のように起動したい場合:
myprog --some-general-opt=hello --adt-optinon-a=value --adt-option-b=value
または多分:
myprog --some-general-opt=hello --adt-options='a_long_config_string'

4

1 に答える 1

1

別のオプション: を使用しstructます。それをどこかのファイルにポップして、それ.hをメソッドに渡します。そうすれば、型安全性が得られ、何が起こっているのかが呼び出し元の関数にとって完全に明白になります。

あなたの構造体の例typedef(コンパイルされていない):

   typedef struct {
      int  size;
      char content_flags;
      ...
   } ADT_PARAMS;

次に、ADT.cファイルで次のようにします。

MyADT_t *my_adt_create(ADT_PARAMS *p) {
    ...
}

コマンドラインから入ってくる引数を処理するために、getargs一般的に名前付き引数を取得する問題を解決する関数がありますsscanf.

const char *fmt = "--%s=%s";
int main(int argc, char **argv) 
{
    int i;
    const ADT_PARAMS p = {..default ADT parameters}
    for(i = 1; i < argc; i++) {
       char *key, *value;
       char *cur = *(argv + i);
       if(!sscanf(fmt, &key, &value)) {
           fprintf(stderr, "Error reading argument: '%s'\n", cur);
           return 1;
       }
       if(!strcmp(key,"some-value")) {
           p.some-value = ...
       }
    }
}
于 2013-06-16T20:56:19.570 に答える