2010-07-25 3 views
1

J'écris le code suivant sur les options_programmes de boost (version 1.42). Cela semble simple et pris à peu près comme cela est du tutoriel. Cependant, j'obtiens une erreur "multiple_occurrences". Une enquête plus poussée découvre que c'est (probablement) le paramètre "filename" qui le soulève.Exception "occurrences multiples" pour boost options_programme

Les paramètres que je donne sont:

3 1 test.txt 100 

Je ne lui soit aperçu .. toute aide sera appréciée.

po::options_description common("Common options"); 

common.add_options() 
    ("help", "produce help message") 
    ("motif_size", po::value<int>(&motif_size), "Size of motif (subgraph)") 
    ("prob", po::value<double>(&prob), "Probably to continue examining an edge") 
    ("filename", po::value<string>(&input_filename), "Filename of the input graph") 
    ("repeats", po::value<int>(&n_estimates), "Number of estimates") 
    ; 

po::options_description all; 
all.add(common); 

po::positional_options_description p; 
p.add("motif_size", 0).add("prob", 1).add("filename", 2).add("repeats", 3); 

po::variables_map vm; 
po::store(po::command_line_parser(argc, argv). 
     options(all).positional(p).run(), vm); 
po::notify(vm); 
+0

Copiez et collez le texte * exact * des messages d'erreur. –

+0

Il n'y en a pas, seulement "occurrences multiples". –

Répondre

5

EDIT:

le deuxième paramètre à po::positional_options_description::add est le max count, pas la position. La position est implicite dans l'ordre dans lequel vous spécifiez les options positionnelles. Alors

p.add("motif_size", 0).add("prob", 1).add("filename", 2).add("repeats", 3); 

devrait être

p.add("motif_size", 1).add("prob", 1).add("filename", 1).add("repeats", 1); 

Voici un extrait compilable

include <boost/program_options.hpp> 

#include <iostream> 
#include <string> 

int 
main(unsigned argc, char** argv) 
{ 
    namespace po = boost::program_options; 
    po::options_description common("Common options"); 

    common.add_options() 
     ("help", "produce help message") 
     ("motif_size", po::value<int>(), "Size of motif (subgraph)") 
     ("prob", po::value<double>(), "Probably to continue examining an edge") 
     ("filename", po::value<std::string>(), "Filename of the input graph") 
     ("repeats", po::value<int>(), "Number of estimates") 
     ; 

    po::options_description all; 
    all.add(common); 

    po::positional_options_description p; 
    p.add("motif_size", 1).add("prob", 1).add("filename", 1).add("repeats", 1); 

    po::variables_map vm; 
    try { 
     po::store(po::command_line_parser(argc, argv). 
       options(all).positional(p).run(), vm); 
     po::notify(vm); 
    } catch (const boost::program_options::error& e) { 
     std::cerr << e.what() << std::endl; 
    } 

    return 0; 
} 

et invocation de l'échantillon.

macmini:~ samm$ g++ parse.cc -lboost_program_options 
macmini:~ samm$ ./a.out 3 1 test.txt 100 
macmini:~ samm$ 

Ma réponse originale est ci-dessous.


Quelle version de programme_options? J'ai eu le même problème en utilisant boost 1.39, pour le résoudre j'ai fini par utiliser boost 1.42.

Voici un lien vers le ticket décrivant le problème, et un correctif à appliquer si vous ne voulez pas ou ne pouvez pas mettre à jour votre copie de boost. Pour utiliser la nouvelle fonctionnalité, procédez comme suit:

try { 
    // argument parsing goes here 
} catch (const boost::program_options::multiple_occurrences& e) { 
    std::cerr << e.what() << " from option: " << e.get_option_name() << std::endl; 
} 
+0

C'est 1,42. Je sais déjà quelle est l'option problématique - c'est "nom de fichier". Je ne sais pas quelle est la cause de cela. –

+0

peut-être vos options de position? Postez les arguments que vous essayez d'analyser. –

+0

J'ai mis à jour le post. –

Questions connexes