私はコマンドライン引数を解析するためにgetoptを使用しています。私のオプションにはオプションがいくつかあるということです。私のプロジェクトはマップの異なるバックエンド実装をテストすることで、-bフラグはどの実装を使うかを指定します。オプションのほとんどはまっすぐですが、ハッシュテーブルを使用するバックエンド(連鎖型およびオープン型)には、末尾に追加して負荷係数を指定できる追加の番号があります。したがって、-b chained-0.75
となります。オプションにオプションがあるときにgetoptを使うC++
文字列の "連鎖"部分を無視し、それを変換するためにatof()を使用するので、私は8から最後(または "オープン"オプション)の部分文字列を取ります。二重にして、私の地図を宣言してください。私はoptargがchar配列(?)だと信じていますが、試しても型不一致エラーに陥ってしまいますstd::string str(optarg);
else if (strcasecmp(optarg, "chained") == 0)
の代わりに何を書いていいのかわからないので、最後に数字がある可能性があります。だから今私が行うとき-b chained-0.75
それは使用関数を呼び出します。ここで
は、私がこれまで持っているものです。
while ((c = getopt(argc, argv, "hb:n:p:")) != -1) {
switch (c) {
case 'b':
if (strcasecmp(optarg, "unsorted") == 0) {
map = new UnsortedMap();
} else if (strcasecmp(optarg, "sorted") == 0) {
map = new SortedMap();
} else if (strcasecmp(optarg, "bst") == 0) {
map = new BSTMap();
} else if (strcasecmp(optarg, "unordered") == 0) {
map = new UnorderedMap();
} else if (strcasecmp(optarg, "chained") == 0) {
double load_factor;
std::string str(optarg);
std::string ld_str = str.substr(8, str.length()-1);
load_factor = atof(ld_str);
map = new ChainedMap(load_factor);
} else if (strcasecmp(optarg, "open") == 0) {
map = new OpenMap();
} else {
usage(1);
}
break;
任意のヒントやアイデアをいただければ幸いです!
これはまさに私が必要としていたものです。それが私の問題の1つを解決しました - ありがとう! – Catherine