2017-09-06 9 views
1

以下のコードは、複数回指定された引数を検出します。ブーストプログラムオプション:1回以上引数が検出されました

コマンドライン引数パーサは、ユーザがstring (mps-file),integer (n)、およびsequence of integer (0, n-1)を提供し、他のものをオプションにすることができるように実装されています。
g++ -std=c++11 test.cpp /home/not_me/my_lib/boost_1_64_0/stage/lib/libboost_program_options.so

完全にコンパイルされます。コードは以下のフラグを使用してコンパイルされているが

、。しかし、次のように実行すると、次の例外がスローされます。次のコマンドを使用して実行した場合

/src/a.out --mps-file earth.mps --n 5 --size 10 --seed 10 --order 0 1 2 3 4 
error: option '--mps-file' cannot be specified more than once 

は、しかし、それは正常に動作:
./src/a.out earth.mps 5 10 10 --order 0 1 2 3 4

全コード:

#include <iostream> 
#include <numeric> 

#include <boost/program_options.hpp> 

int main (int argc, char* argv[]) { 

    int n; 
    int sample_size = 10; 
    std::random_device rd; 
    int seed = rd(); 
    std::string mps_name; 
    std::vector<int> order; 

    boost::program_options::options_description desc("options"); 
    desc.add_options() 
     ("mps-file", boost::program_options::value<std::string>(&mps_name)->required(), "input mps file") 
     ("n", boost::program_options::value<int>(&n)->required(), "number of variables") 
     ("size", boost::program_options::value<int>(&sample_size)->default_value(sample_size), "size of sample") 
     ("seed", boost::program_options::value<int>(&seed)->default_value(seed), "seed value") 
     ("order", boost::program_options::value<std::vector<int>>(&order)->required(), "ordering") 
     ("help", "this help message") 
     ; 

    boost::program_options::positional_options_description p; 
    p.add("mps-file", 1); 
    p.add("n", 1); 
    p.add("order", -1); 

    boost::program_options::variables_map vm; 

    try { 
     boost::program_options::store(boost::program_options::command_line_parser(argc, argv). 
             options(desc).positional(p).run(), vm); 

     if (vm.count("help") || argc == 1) { 
      std::cout << "usage: " << argv[0] << " [options]" << std::endl; 
      std::cout << desc; 
      return -1; 
     } 

     boost::program_options::notify(vm); 
    } 
    catch (std::exception& e) { 
     std::cout << "error: " << e.what() << std::endl; 
     return -1; 
    } 

    std::vector<int> temp = order; 
    std::sort(temp.begin(), temp.end()); 
    for (int i = 0; i < n; ++i) { 
     if (temp[i] == i) { continue; } 
     std::cout << "incorrect ordering given" << std::endl; 
     return -1; 
    } 

    if (n != order.size()) { 
     std::cout << "mismatch between the 'n' and given ordering" << std::endl; 
     return -1; 
    } 

    return 0; 
} // main 
+0

@マークB私もそれを試しました。 ( 'p.add()'にコメントすることによって)位置的な引数を取り除いても問題は解決されません。 – letsBeePolite

+0

'libboost_program_options.s'? .sファイルはアセンブラのソースコードです。アセンブラファイルを 'gcc'に移植するのは非常に奇妙です。 –

+0

@ MarkBの位置指定引数_require_ Boostプログラムのオプションに存在する名前付きのオプションの説明 – sehe

答えて

0

問題は、位置のオプションです。それらを削除すると、boost::program_options::command_line_parser(argc, argv). options(desc).positional(p).run() からpositional(p)が呼び出されると、問題はなくなります。 add()行だけを削除してpositional(p)を残してしまったので、「コマンドラインに位置指定オプションが多すぎます」という別の問題があります。

私はあなたの呼び出しに問題があるとします

/src/a.out --mps-file earth.mps --n 5 --size 10 --seed 10 --order 0 1 2 3 4

が位置1に定義された位置のオプションがある場合には、その文字列---mps-fileこのオプション自体の価値と見なすことができるということです。したがって、オプションが定位置として定義されていれば、名前付きのオプションを渡すことは避けてください。

+0

それは私のために働いていません – letsBeePolite

+0

@letsBeePolite何があなたのためにうまくいかなかったのですか? '' '' boost :: program_options :: command_line_parser(argc、argv).options(desc).run() '' '? –

関連する問題