C++ 상태 머신의 개념

Muhammad Adil 2023년10월12일
  1. C++의 상태 머신 개요
  2. 상태 머신의 이점
  3. C++의 상태 전환
  4. C++의 상태 머신 클래스
C++ 상태 머신의 개념

이 자습서에서는 C++ 상태 머신의 개념에 대해 교육하고 이를 사용하는 방법을 설명하며 그 이점을 강조합니다.

C++의 상태 머신 개요

C++의 상태 기계를 이해하려면 먼저 유한 상태 기계의 개념에 대해 알아야 합니다.

유한 상태 기계는 컴퓨터가 지정된 시간에 상태의 유한 숫자 중 하나에 있을 수 있고 시간이 진행됨에 따라 이러한 상태 간에 변경될 수 있다는 아이디어를 캡처하는 계산의 수학적 모델입니다.

상태 머신은 상태, 전환 및 작업으로 구성됩니다. 상태는 FSM이 있을 수 있는 다양한 조건입니다. 전환은 한 상태에서 다른 상태로 변경을 유발하는 작업입니다.

작업은 FSM이 한 상태에서 다른 상태로 변경될 때 발생합니다. C++ 언어에는 상태 머신을 정의하는 세 가지 키워드인 enum, switchgoto가 있습니다.

An 열거형은 FSM에서 가능한 각 상태를 나타내는 일련의 상수를 정의합니다. switch 문은 활성 상태를 확인하고 적절한 작업을 실행합니다.

Goto는 명령문을 중단하거나 반환하지 않고 중첩된 루프 또는 스위치 명령문에서 점프하는 데 사용됩니다.

상태 머신의 이점

일부 혜택은 다음과 같습니다.

  • 상태 기계는 간단한 전환 규칙을 통해 복잡한 동작을 표현하는 우아한 방법을 제공합니다.
  • 신호등, 엘리베이터 또는 인간 언어와 같은 실제 시스템의 특정 측면을 모델링하는 데 매우 적합합니다.
  • 상태 기계는 설계를 일련의 단계 또는 상태 기계 전문 용어로 된 상태로 분해합니다. 각 상태는 특정 작업을 담당합니다.
  • 대조적으로, 이벤트는 상태 기계가 상태 사이를 이동하거나 전이하도록 하는 자극입니다.

C++의 상태 전환

C++ 상태 머신 코드의 상태 전환은 프로그램의 상태가 한 상태에서 다른 상태로 변경되는 프로세스입니다. 이벤트 또는 조건은 트리거라고 하는 상태 변경을 트리거할 수 있습니다.

상태가 변경되면 메시지 인쇄 또는 화면의 개체 색상 변경과 같은 일부 작업을 실행할 수 있습니다.

예를 들어 오랫동안 이벤트가 없었다가 이벤트가 발생하면 waiting에서 default로 전환됩니다. C++ 프로그래밍 언어는 switch 문을 사용하여 상태 머신을 구현하는 쉬운 방법을 제공합니다.

C++의 상태 머신 클래스

상태 시스템을 구축할 때 StateMachineEventData라는 두 가지 기본 클래스가 필요합니다. 클래스는 상태 변경 및 이벤트 처리를 지원하는 데 필요한 구성 요소를 가져오기 위해 StateMachine에서 파생됩니다.

StateMachine 헤더에는 상태 시스템을 구현하는 데 도움이 되는 여러 전처리기 다중 행 매크로도 포함되어 있습니다. 상태 함수에 고유한 데이터를 제공하려면 구조가 EventData 기본 클래스의 상속자여야 합니다.

state_machine.cppdemo.h 파일에서 상태 시스템의 소스 코드를 찾을 수 있습니다.

state_machine.cpp에 대한 예제 코드:

#include <iostream>

#include "demo.h"
using namespace std;
void Execute_State_Machine(void) {
  int 1st_state = 0;
  while (1) {
    char trans_letter;
    cout << "1st state: " << 1st_state << "\n";
    cout << "Enter trans letter: ";
    cin >> trans_letter;
    cin.ignore(100, '\n');
    demo_Entry const* bn = demo_begin();
    demo_Entry const* const p_demo_end = demo_end();
    bool demo_um = false;
    while ((!demo_um) && (bn != p_demo_end)) {
      if (bn->1st_state_id == 1st_state) {
        if (bn->trans_letter == trans_letter) {
          cout << "changing"
               << " from 1st " << 1st_state << ", to 2nd " << bn->pro_state_id
               << "\n";
          1st_state = bn->pro_state_id;
          demo_um = true;
          break;
        }
      }
      ++bn;
    }
    if (!demo_um) {
      cerr << "same\n";
    }
  }
}

demo.h에 대한 예제 코드:

struct demo_x {
  int 1st_state_id;
  char trans_letter;
  int 2nd_state_id;
};
demo_x const* demo_begin(void);
demo_x const* demo_end(void);

demo.cpp에 대한 예제 코드:

#include "demo.h"
static const demo_x demo_m[] = {
    {0, 'T', 1},
    {0, 'U', 2},
    {0, 'V', 3},
};
static const int demo = sizeof(demo_m) / sizeof(demo_m[0]);
Table_Entry const* table_begin(void) { return &demo_m[0]; }
Table_Entry const* table_end(void) { return &demo_m[demo]; }

위에서 언급한 코드의 작동을 확인하려면 여기를 클릭하십시오.

Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook