boost MPL::vector не распознан и таблица переходов Meta State Machine (MSM) не определена

avatar
qwa
8 апреля 2018 в 08:50
190
1
1

Я пытаюсь изучить библиотеку метасостояний (MSM) Boost.

Следуя примеру с простым конечным автоматом в http://redboltz.wikidot.com/simple-state-machine, я столкнулся с некоторыми проблемами:

  1. У меня проблема с определением "таблицы переходов" конечного автомата с использованием boost::mpl::vector.

    // Transition table
    struct transition_table:mpl::vector<
        //          Start   Event   Next    Action      Guard
        msmf::Row < State1, Event1, End,    msmf::none, msmf::none >
    > {};
    
  2. Среда Qt Creator IDE не обнаруживает и не выполняет автоматическое завершение mpl::vector (она распознает только пронумерованные версии, т.е. mpl::vector0/1...)!!!

  3. Код компилируется (без ошибок), но при его запуске происходит сбой (в строке 203 из state_machine_def.hpp, которая касается обработчика перехода FSM)

  4. Я использую Boost 1.66 в Windows 7 с 32-разрядным компилятором Qt 5.9.0 MinGW.

  5. Я добавил путь boost к моему пути включения (поскольку MSM и MPL являются библиотеками только для заголовков)

Вопросы

Q1 - Почему моя система не распознает boost::mpl::vector?

Q2 — Замена mpl::vector на mpl::vector1 (который распознается моей IDE, QtCreator) не решает мою проблему (сбой во время выполнения)

Напоминание: SM в приведенном выше примере имеет только ОДНУ запись перехода.

Любая помощь приветствуется

Источник

Ответы (1)

avatar
sehe
8 апреля 2018 в 19:19
0
  1. в чем проблема?
  2. все в порядке. Механизм завершения, вероятно, неправильно настроен или использует старый стандарт, то есть он не понимает все заголовки Boost.

    mpl::vector буквально представляет собой просто список типов, так что никакого «интеллектуального смысла» ожидать не приходится: вы можете задавать только типы, и компилятор не может предсказать, какие типы вам нужны.

    mpl::vector<int, double, std::string> так же допустимо, как mpl::vector<>.

  3. важно, чтобы ваш компилятор это понимал. Так что, видимо, да.

    Если у вас возникла ошибка во время выполнения, узнайте информацию о сбое. Код по ссылке

  4. См. ^

  5. Да, иначе он бы не скомпилировался

Q1

Он распознает boost::mpl::vector, иначе он не скомпилировался бы. См. 2.

Q2

Нет никакой разницы: оба моделируют одну и ту же последовательность типов. Один вариативный, а другой "число" (т.е. имеет фиксированную длину): https://www.boost.org/doc/libs/1_66_0/libs/mpl/doc/refmanual/vector.html

qwa
9 апреля 2018 в 11:35
0

Большое спасибо, что потратили свое время и проработали все пункты; Я нашел проблему; MSM требует, чтобы структура «transition_table» была определена точно так, как указано. Я немного ошибся, и поэтому я получил ошибку времени выполнения; Я разместил этот комментарий здесь на случай, если кто-то еще столкнется с той же проблемой. Ваши ответы были полезны, и позвольте мне продолжить поиск проблемы в другом месте. В большом SM такие орфографические ошибки могут возникать, и соответствующий конечный автомат будет компилироваться и давать сбой только во время выполнения. Есть ли другой способ проверить и найти такие проблемы при использовании boost::msm??

qwa
9 апреля 2018 в 11:38
0

Последний вопрос: в документации boost::msm не подчеркивается, что структуры «transition_table» или «on-entry» и «on_exit» должны быть определены именно так, как упоминалось (или, может быть, я пропустил это). Есть ли какой-либо документ, в котором упоминаются «синтаксические» моменты, которые следует соблюдать при работе с boost::msm? Заранее спасибо.

sehe
9 апреля 2018 в 11:59
0

@qwa Я согласен с тем, что если опечатки приводят к сбоям во время выполнения, это может быть ошибкой удобства использования. OTOH, я не видел вашей конкретной неправильной конфигурации, так что это могло иметь смысл (возможно, сбой был простым бесконечным циклом и т. д.). Мой хрустальный шар не работает достаточно хорошо, чтобы судить об этом, но если вы не уверены вы можете сообщить о проблеме сопровождающим библиотеки

sehe
9 апреля 2018 в 12:05
0

Документы просто говорят: «охрана: логическая операция, способная предотвратить запуск перехода, который в противном случае сработал бы». - страница концепций также описывает это как «логическую операцию», но, похоже, это не определено дополнительно. Я бы просто следовал примеру инструкций