用C語言實現有限狀態機--讀《C專家程式設計》
有限狀態機(finite state machine)是一個數學概念,如果把它運用於程式中,可以發揮很大的作用。它是一種協議,用於有限數量的子程式("狀態")的發展變化。每個子程式進行一些處理並選擇下一種狀態(通常取決於下一段輸入)。
有限狀態機(FSM)可以用作程式的控制結構。FSM對於那些基於輸入的在幾個不同的可選動作中進行迴圈的程式尤其合適。投幣售貨機就是FSM的一個好例子。另外一個你可以想到的複雜的例子就是你正在用的東西,想到了嗎?沒錯,就是作業系統。在投幣售貨機的例子中,輸入是硬幣,輸出是待售商品,售貨機有"接受硬幣","選擇商品","傳送商品"和"找零錢"等幾種狀態。
它的基本思路是用一張表儲存所有可能的狀態,並列出進入每個狀態時可能執行的所有動作,其中最後一個動作就是計算(通常在當前狀態和下一次輸入字元的基礎上,另外再經過一次表查詢)下一個應該進入的狀態。你從一個"初始狀態"開始。在這一過程中,翻譯表可能告訴你進入了一個錯誤狀態,直到到達結束狀態。
在C語言中,有好幾種方法可以用來表達FSM,但它們絕大多數都是基於函式指標陣列。一個函式指標陣列可以像下面這樣宣告:
void (*state[MAX_STATES]) ();
如果知道了函式名,就可以像下面這樣對陣列進行初始化。
extern int a(),b(),c(),d();
int (*state[]) ()={a,b,c,c};
可以通過陣列中的指標來呼叫函式:
(*state[i]) ();
所有函式必須接受同樣的引數,並返回同種型別的返回值(除非你把陣列元素做成一個聯合)。函式指標是很有趣的。注意,我們可以去掉指標形式,把上面的呼叫寫成:
state[i] ();
甚至
(******state[i]) ();
這是一個在ANSI C中流行的不良方法:呼叫函式和通過指標呼叫函式(或任意層次的指標間接引用)可以使用同一種語法。
如果你想幹得漂亮一點,可以讓狀態函式返回一個指向通用後續函式的指標,並把它轉換為適當的型別。這樣,就不需要全域性變數了。如果你不想搞得太花哨,可以使用一個switch語句作為一種簡樸的狀態機,方法是賦值給控制變數並把switch語句放在迴圈內部。關於FSM還有最後一點需要說明:如果你的狀態函式看上去需要多個不同的引數,可以考慮使用一個引數計數器和一個字串指標陣列,就像main函式的引數一樣。我們熟悉的int argc,char *argv[]機制是非常普遍的,可以成功地應用在你所定義的函式中。
相關文章
- 用C語言實現有限狀態自動機FSMC語言
- 使用有限狀態自動機實現C語言的宣告解析器C語言
- 一個有限狀態機的C++實現C++
- Unity/C# 有限狀態機UnityC#
- 23種設計模式 之 State模式(狀態模式)[C語言實現]設計模式C語言
- C語言如何實現泛型程式設計?C語言泛型程式設計
- 專家審讀第8期——《提速C程式》+《征服C語言指標》C程式C語言指標
- C語言程式設計C語言程式設計
- 真的可以,用C語言實現物件導向程式設計OOPC語言物件程式設計OOP
- 作業系統:程式狀態轉換模擬,C語言實現作業系統C語言
- 偽隨機數C語言程式設計隨機C語言程式設計
- C語言指標應用程式設計C語言指標程式設計
- 實驗4 C語言陣列應用程式設計C語言陣列程式設計
- 實驗5 C語言指標應用程式設計C語言指標程式設計
- 實驗3 c語言函式應用程式設計C語言函式程式設計
- 實驗3 C語言函式應用程式設計C語言函式程式設計
- c語言實用小程式C語言
- C語言程式設計原理C語言程式設計
- c語言程式設計題C語言程式設計
- 發現C語言遞迴深度有限制C語言遞迴
- C語言程式設計讀書筆記:結構C語言程式設計筆記
- 【C/C++學院】(23)Mysql資料庫程式設計–C語言程式設計實現mysql客戶端C++MySql資料庫程式設計C語言客戶端
- 奇怪的C語言——C51程式設計C語言注意事項C語言程式設計
- 實驗3_C語言函式應用程式設計C語言函式程式設計
- 實驗4_C語言陣列應用程式設計C語言陣列程式設計
- C語言MySQL程式設計示例C語言MySql程式設計
- C 語言程式設計(unix) (轉)程式設計
- 結對程式設計(c語言)程式設計C語言
- c語言程式設計--實驗報告一C語言程式設計
- c語言程式設計——實驗報告六C語言程式設計
- # c語言程式設計——實驗報告一C語言程式設計
- c語言程式設計——實驗報告一C語言程式設計
- c語言程式設計——實驗報告二C語言程式設計
- C語言程式設計—實驗報告四C語言程式設計
- C語言程式設計-實驗報告4C語言程式設計
- C語言程式設計師必讀的5本書C語言程式設計師
- C語言/C++程式設計學習:棧的程式碼實現之陣列方案C語言C++程式設計陣列
- 從Promise的實現來看有限狀態機Promise