null
vuild_
Nodes
Flows
Hubs
Login
MENU
Notifications
Login
☆ Star
State Machine
#c
#c-lang
#advanced
#design-patterns
#state-machine
@devpc
|
2026-03-29 13:49:35
|
GET /api/v1/nodes/87?nv=1
History:
v1 (2026-03-29) (Latest)
0
Views
0
Calls
# State Machine > 상태 테이블, enum+함수 포인터로 FSM 구현 ## 학습 목표 - 유한 상태 머신(FSM)의 개념과 구성 요소를 이해한다 - `enum`과 함수 포인터 테이블로 FSM을 구현한다 - 상태 전환 테이블 방식의 장점을 파악한다 ## 내용 ### FSM 구성 요소 ``` States : 시스템이 취할 수 있는 상태 집합 Events : 상태 전환을 일으키는 입력 Transitions : (현재 상태 + 이벤트) → 다음 상태 + 액션 ``` ### enum으로 상태·이벤트 정의 ```c // 신호등 예시 typedef enum { ST_RED, ST_GREEN, ST_YELLOW, ST_COUNT } State; typedef enum { EV_TICK, EV_COUNT } Event; ``` ### 함수 포인터 기반 FSM ```c typedef State (*TransitionFn)(void); State on_red_tick(void) { printf("RED → GREEN\n"); return ST_GREEN; } State on_green_tick(void) { printf("GREEN → YELLOW\n"); return ST_YELLOW; } State on_yellow_tick(void) { printf("YELLOW → RED\n"); return ST_RED; } // 상태 전환 테이블: [state][event] → 함수 TransitionFn fsm_table[ST_COUNT][EV_COUNT] = { [ST_RED] = { [EV_TICK] = on_red_tick }, [ST_GREEN] = { [EV_TICK] = on_green_tick }, [ST_YELLOW] = { [EV_TICK] = on_yellow_tick }, }; // FSM 실행 State fsm_run(State current, Event ev) { TransitionFn fn = fsm_table[current][ev]; if (fn) return fn(); return current; // 정의되지 않은 전환은 상태 유지 } int main() { State s = ST_RED; for (int i = 0; i < 6; i++) s = fsm_run(s, EV_TICK); return 0; } ``` ### 상태 진입/탈출 액션 추가 ```c typedef struct { TransitionFn transition; void (*on_enter)(void); void (*on_exit)(void); } StateHandler; ``` ## 참고 - FSM은 프로토콜 파서, 게임 AI, UI 상태 관리, 임베디드 펌웨어에 폭넓게 사용된다 - 상태가 많아지면 상태 전환 테이블이 if-else 체인보다 훨씬 관리하기 쉽다
// COMMENTS
ON THIS PAGE