Я пытаюсь изучить библиотеку метасостояний (MSM) Boost.
Следуя примеру с простым конечным автоматом в http://redboltz.wikidot.com/simple-state-machine, я столкнулся с некоторыми проблемами:
-
У меня проблема с определением "таблицы переходов" конечного автомата с использованием
boost::mpl::vector
.// Transition table struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, End, msmf::none, msmf::none > > {};
Среда Qt Creator IDE не обнаруживает и не выполняет автоматическое завершение
mpl::vector
(она распознает только пронумерованные версии, т.е.mpl::vector0/1
...)!!!Код компилируется (без ошибок), но при его запуске происходит сбой (в строке 203 из
state_machine_def.hpp
, которая касается обработчика перехода FSM)Я использую Boost 1.66 в Windows 7 с 32-разрядным компилятором Qt 5.9.0 MinGW.
Я добавил путь boost к моему пути включения (поскольку MSM и MPL являются библиотеками только для заголовков)
Вопросы
Q1 - Почему моя система не распознает
boost::mpl::vector
?Q2 — Замена
mpl::vector
наmpl::vector1
(который распознается моей IDE, QtCreator) не решает мою проблему (сбой во время выполнения)
Напоминание: SM в приведенном выше примере имеет только ОДНУ запись перехода.
Любая помощь приветствуется
Большое спасибо, что потратили свое время и проработали все пункты; Я нашел проблему; MSM требует, чтобы структура «transition_table» была определена точно так, как указано. Я немного ошибся, и поэтому я получил ошибку времени выполнения; Я разместил этот комментарий здесь на случай, если кто-то еще столкнется с той же проблемой. Ваши ответы были полезны, и позвольте мне продолжить поиск проблемы в другом месте. В большом SM такие орфографические ошибки могут возникать, и соответствующий конечный автомат будет компилироваться и давать сбой только во время выполнения. Есть ли другой способ проверить и найти такие проблемы при использовании boost::msm??
Последний вопрос: в документации boost::msm не подчеркивается, что структуры «transition_table» или «on-entry» и «on_exit» должны быть определены именно так, как упоминалось (или, может быть, я пропустил это). Есть ли какой-либо документ, в котором упоминаются «синтаксические» моменты, которые следует соблюдать при работе с boost::msm? Заранее спасибо.
@qwa Я согласен с тем, что если опечатки приводят к сбоям во время выполнения, это может быть ошибкой удобства использования. OTOH, я не видел вашей конкретной неправильной конфигурации, так что это могло иметь смысл (возможно, сбой был простым бесконечным циклом и т. д.). Мой хрустальный шар не работает достаточно хорошо, чтобы судить об этом, но если вы не уверены вы можете сообщить о проблеме сопровождающим библиотеки
Документы просто говорят: «охрана: логическая операция, способная предотвратить запуск перехода, который в противном случае сработал бы». - страница концепций также описывает это как «логическую операцию», но, похоже, это не определено дополнительно. Я бы просто следовал примеру инструкций