首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

有限狀態機編程模式:原理、實現與應用場景

     編輯:關於C語言

有限狀態機編程模式:原理、實現與應用場景

有限狀態機 (FSM) 以 有限狀態集合、事件/輸入、轉移函數、動作 形式化描述系統行為。廣泛用於協議解析、遊戲 AI、編譯器詞法分析、嵌入式控制邏輯。

核心要素

  • States:系統可能處於的狀態 (如 IDLE, CONNECTING, CONNECTED, ERROR)。
  • Events/Inputs:觸發轉移的外部輸入 (如 RECV_SYN, TIMEOUT, USER_CLICK)。
  • Transitions:Current State × Event → Next State 映射表。
  • Actions:進入/退出狀態、轉移時執行的副作用 (發送封包、更新 UI、寫日誌)。

實現方式對比

C 語言查表法範例

typedef enum {IDLE, CONN, AUTH, ESTAB} State;
typedef enum {EV_SYN, EV_ACK, EV_DATA, EV_FIN, EV_TIMEOUT} Event;

typedef struct { State next; void (*action)(void); } Transition;

Transition table[4][5] = {
    [IDLE]    = {{CONN, send_syn},   {IDLE, NULL}, ...},
    [CONN]    = {{IDLE, reset},      {AUTH, send_auth}, ...},
    // ...
};

State current = IDLE;
void handle_event(Event e) {
    Transition tr = table[current][e];
    if (tr.action) tr.action();
    current = tr.next;
}

設計原則

  1. 單一職責:每狀態只處理相關事件。
  2. 完整覆蓋:所有 (State, Event) 組合必有定義 (含錯誤轉移)。
  3. 冪等性:重複事件不應導致異常副作用。
  4. 可觀測性:記錄狀態變遷日誌,便於除錯。

應用場景

  • 網路協議 (TCP 狀態機、HTTP 解析器、MQTT)。
  • 詞法/語法分析器 (正則表達式引擎本質是 FSM)。
  • 遊戲角色行為 (巡邏→追擊→攻擊→逃跑)。
  • 嵌入式控制 (電梯、自動販賣機、交通燈)。
  • 業務流程引擎 (訂單狀態:建立→付款→發貨→完成/退款)。

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方式優點缺點適用
Switch-Case簡單直觀、適合小型 FSM狀態多時代碼膨脹、難維護<10 狀態
狀態表 (查表法)數據驅動、易擴展、表驅動測試動作邏輯分離、複雜動作需回調中型、協議解析
狀態模式每狀態一類、封裝轉移/動作、OCP類別爆炸、間接呼叫開銷大型、遊戲 AI
嵌入式框架代碼生成、圖形化建模、驗證學習曲線、依賴工具鏈安全關鍵系統