2016-11-08 4 views
1

У меня проблема. Я использую Cmake и увеличиваю с VS 2015.Cmake, Boost синтаксический анализ командной строки

Я намерен разработать инструмент, используя cgal и assimp. Преобразование форматов файлов в мои собственные. Тем не менее, я столкнулся с проблемой и мог быть простым, но не могу это видеть.

Когда я нажимаю F5, я получаю ошибку отладки, как два изображения, которые я прикреплял. Я также добавил свой код. Изображения здесь:

enter image description here

enter image description here

#include <boost/asio.hpp> 
#include <boost/filesystem/path.hpp> 
#include <boost/iostreams/device/file_descriptor.hpp> 
#include <boost/iostreams/stream.hpp> 
#include <boost/program_options.hpp> 
#include <boost/system/error_code.hpp> 
#include <iostream> 
#include <sstream> 
#include <string> 

struct CMDOPTIONS { 
    std::string input, output, directory; 
    int points; 
}; 

namespace po = boost::program_options; 

bool process_command_line(int argc, char **argv, CMDOPTIONS &cmdoptions1) { 

    if (argv == nullptr) { 
     return false; 
    } 

    try { 
     po::options_description desc("Program Usage"); 
     po::options_description desc ("Program Usage"); 
     desc.add_options() 
      ("halp, h", "Halp!") 
      ("input, i", po::value<std::string>(&cmdoptions1.input), "Specify Input") 
      ("output, o", po::value<std::string>(&cmdoptions1.output) ,"Specify Output") 
      ("points, p", po::value<int>(&cmdoptions1.points), "% of reduced points") 
      ("directory, d", po::value<std::string>(&cmdoptions1.directory)->required(), "set the directory"); 

     po::variables_map vm; 
     po::store(po::parse_command_line(argc, argv, desc), vm); 
     po::notify(vm); 

     if (vm.count("help")) { 
      std::cout << desc << std::endl; 
      return false; 
     } 

     // trolololol XD 
     if (vm.count("input")) { 
      &cmdoptions1.input; 
     } 

     if (vm.count("output")) { 
      &cmdoptions1.output; 
     } 

     if (vm.count("points")) { 
      &cmdoptions1.points; 
     } 

     if (vm.count("directory")) { 
      &cmdoptions1.directory; 
     } 

    } catch (std::exception &e) { 
     std::cerr << "Error: " << e.what() << std::endl; 
     return false; 
    } catch (int e) { 
     std::cerr << "Unknown error!" << e << std::endl; 
     return false; 
    } 

    return true; 
} 

int main(int argc, char **argv, CMDOPTIONS &cmdoptions1) { 

    bool result = process_command_line(argc, argv, cmdoptions1); 
    if (!result) 
     return -1; 

    std::cout << "input" << &cmdoptions1.input << std::endl; 
    std::cout << "output" << &cmdoptions1.output << std::endl; 
    std::cout << "points" << &cmdoptions1.points << std::endl; 
    std::cout << "directory\t" << &cmdoptions1.directory << std::endl; 
} 
+3

Проверить, где утверждают происходит. Вы попали в отладчик. Используй это! – sehe

+0

Да, я после нажатия Retry показан, где он остановился на desc..add_options. Неясно, почему это проблема. –

+1

хорошо, вы получите окно, в котором вы попали в точку останова. Просто используйте кнопку разрыва и исследуйте. Вы используете опционы с более быстрой версией. Визуальная студия должна указывать на то, где и как – Hayt

ответ

2

Ваш cmdoptions1 не инициализирован.

На самом деле, ваш main не должен компилироваться (что это за подпись?).

Кроме того, вы печатаете указатели на значения конфигурации.

В-третьих, компилятор не получает ваших намерений при вводе trololol XD.

Live On Coliru

#include <boost/asio.hpp> 
#include <boost/filesystem/path.hpp> 
#include <boost/iostreams/device/file_descriptor.hpp> 
#include <boost/iostreams/stream.hpp> 
#include <boost/program_options.hpp> 
#include <boost/system/error_code.hpp> 
#include <iostream> 
#include <sstream> 
#include <string> 

struct CMDOPTIONS { 
    std::string input, output, directory; 
    int points; 
}; 

namespace po = boost::program_options; 

bool process_command_line(int argc, char **argv, CMDOPTIONS &cmdoptions1) { 

    if (argv == nullptr) { 
     return false; 
    } 

    try { 
     po::options_description desc("Program Usage"); 
     desc.add_options() 
      ("halp, h", "Halp!") 
      ("input, i", po::value<std::string>(&cmdoptions1.input), "Specify Input") 
      ("output, o", po::value<std::string>(&cmdoptions1.output) ,"Specify Output") 
      ("points, p", po::value<int>(&cmdoptions1.points), "% of reduced points") 
      ("directory, d", po::value<std::string>(&cmdoptions1.directory)->required(), "set the directory"); 

     po::variables_map vm; 
     po::store(po::parse_command_line(argc, argv, desc), vm); 
     po::notify(vm); 

     if (vm.count("help")) { 
      std::cout << desc << std::endl; 
      return false; 
     } 

    } catch (std::exception &e) { 
     std::cerr << "Error: " << e.what() << std::endl; 
     return false; 
    } catch (int e) { 
     std::cerr << "Unknown error!" << e << std::endl; 
     return false; 
    } 

    return true; 
} 

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

    CMDOPTIONS cmdoptions1; 
    bool result = process_command_line(argc, argv, cmdoptions1); 
    if (!result) 
     return -1; 

    std::cout << "input"  << cmdoptions1.input  << std::endl; 
    std::cout << "output"  << cmdoptions1.output << std::endl; 
    std::cout << "points"  << cmdoptions1.points << std::endl; 
    std::cout << "directory\t" << cmdoptions1.directory << std::endl; 
} 
Смежные вопросы