2013-05-27 6 views
2

boost :: msm 튜토리얼에서 현재 상태를 확인하는 방법을 보여주는 예제가 있습니다.boost :: msm의 상태 ID

// Transition table for player 
    struct transition_table : mpl::vector< 
     //  Start  Event   Next  Action    Guard 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Stopped , play  , Playing , &p::start_playback       >, 
     a_row < Stopped , open_close , Open , &p::open_drawer       >, 
     a_row < Stopped , stop  , Stopped , &p::stopped_again       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Open , open_close , Empty , &p::close_drawer       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Empty , open_close , Open , &p::open_drawer       >, 
     a_row < Empty , cd_detected , Stopped , &p::store_cd_info       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Playing , stop  , Stopped , &p::stop_playback       >, 
     a_row < Playing , pause  , Paused , &p::pause_playback       >, 
     a_row < Playing , open_close , Open , &p::stop_and_open       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Paused , end_pause , Playing , &p::resume_playback      >, 
     a_row < Paused , stop  , Stopped , &p::stop_playback       >, 
     a_row < Paused , open_close , Open , &p::stop_and_open       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < AllOk , error_found ,ErrorMode, &p::report_error       >, 
     a_row <ErrorMode,end_error ,AllOk , &p::report_end_error      > 
     // +---------+-------------+---------+---------------------+----------------------+ 
    > {}; 

    // Replaces the default no-transition response. 
    template <class FSM,class Event> 
    void no_transition(Event const& e, FSM&,int state) 
    { 
     std::cout << "no transition from state " << state 
      << " on event " << typeid(e).name() << std::endl; 
    } 
}; 
// Pick a back-end 
typedef msm::back::state_machine<player_> player; 

// 
// Testing utilities. 
// 
static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused","AllOk","ErrorMode" }; 

void pstate(player const& p) 
{ 
    // we have now several active states, which we show 
    for (unsigned int i=0;i<player::nr_regions::value;++i) 
    { 
     std::cout << " -> " << state_names[p.current_state()[i]] << std::endl; 
    } 
} 

저자는 배열 state_names을 사용합니다. 그러나 나는 국가의 순서를 결정하는 방법에 대한 설명을 찾지 못했습니다. 물론 전이 표의 "시작"열에있는 상태의 순서라고 추측 할 수 있습니다. 그러나 일부 주에서는 "시작"열에 있지 않은 경우는 어떻게됩니까?

답변

1

이 내용은 MSM 설명서 (6 장 내부, 생성 된 상태 ID)에서 설명합니다. 순서는 전환 표의 소스 상태에 대한 각각의 순서와 대상 상태의 각 순서에 따라 예상되는 순서입니다.