基於C語言的狀態機實現技術

2021-07-11 18:36:18 字數 2090 閱讀 7683

一、簡介

有限狀態機是一種用來進行物件行為建模的工具,其作用主要是描述物件在它的生命週期內所經歷的狀態序列,以及如何響應來自外界的各種事件。有限狀態機(finite state machine或者finite state automata)是軟體領域中一種重要的工具,很多東西的模型實際上就是有限狀態機。有限狀態機(fsm)可以用作程式的控制結構。fsm對於那些基於輸入的在幾個不同的可選動作中進行迴圈的程式尤其合適。投幣售貨機就是fsm的乙個好例子。在投幣售貨機的例子中,輸入是硬幣,輸出是待售商品,售貨機有"接受硬幣","選擇商品","傳送商品"和"找零錢"等幾種狀態。它的基本思路是用一張表儲存所有可能的狀態,並列出進入每個狀態時可能執行的所有動作,其中最後乙個動作就是計算(通常在當前狀態和下一次輸入字元的基礎上,另外再經過一次表查詢)下乙個應該進入的狀態。

狀態機特別適合描述那些有發生有先後順序,或者有邏輯規律的事情——其實這就是狀態機的本質。狀態機的本質就是對具有邏輯順序或時序規律事件的一種描述方法。這個論斷的最重要的兩個詞就是「邏輯順序」和「時序規律」,這兩點就是狀態機所要描述的核心和強項,換言之,所有具有邏輯順序和時序規律的事情都適合用狀態機描述。

在描述有限狀態機時,狀態、事件、轉換和動作是經常會碰到的幾個基本概念。

•狀態(state):指的是物件在其生命週期中的一種狀況,處於某個特定狀態中的物件必然會滿足某些條件、執行某些動作或者是等待某些事件。

•事件(event):指的是在時間和空間上占有一定位置,並且對狀態機來講是有意義的那些事情。事件通常會引起狀態的變遷,促使狀態機從一種狀態切換到另一種狀態。

•轉換(transition):指的是兩個狀態之間的一種關係,表明物件將在第乙個狀態中執行一定的動作,並將在某個事件發生同時某個特定條件滿足時進入第二個狀態。

•動作(action):指的是狀態機中可以執行的那些原子操作,所謂原子操作指的是它們在執行的過程中不能被其他訊息所中斷,必須一直執行下去。

狀態機的基本要素有3 個,分別是:狀態、輸出和輸入。

1.狀態:也叫狀態變數。

2.輸出:輸出指在某乙個狀態時特定發生的事件。

3.輸入:指狀態機中進入每個狀態的條件,有的狀態機沒有輸入條件,其中的狀態轉移較為簡單,有的狀態機有輸入條件,當某個輸入條件存在時才能轉移到相應的狀態。

根據狀態機的數量是否為有限個,可將狀態機分為有限狀態機(finite state machine,fsm)和無限狀態機(infinite state machine,ism)。一般所涉及的狀態都是有限的,所以以後我們所說的狀態機都指有限狀態機,用fsm 表示。

二、基於c語言的狀態機實現

2.1、基於switch(狀態)的實現

在實現有限狀態機時,使用switch語句是最簡單也是最直接的一種方式,其基本思路是為狀態機中的每一種狀態都設定乙個case分支。

2.2基於函式指標陣列的實現

乙個函式指標陣列可以像下面這樣宣告:

void (*state[max_states]) ();

如果知道了函式名,就可以像下面這樣對陣列進行初始化。

extern int a(),b(),c(),d();

int (*state) ()=;

可以通過陣列中的指標來呼叫函式:

(*state[i]) ();

所有函式必須接受同樣的引數,並返回同種型別的返回值(除非你把陣列元素做成乙個聯合)。還可以讓狀態函式返回乙個指向通用後續函式的指標,並把它轉換為適當的型別。這樣,就不需要全域性變數了。

如果你的狀態函式看上去需要多個不同的引數,可以考慮使用乙個引數計數器和乙個字串指標陣列,就像main函式的引數一樣。我們熟悉的int argc,char *argv機制是非常普遍的,可以成功地應用在你所定義的函式中。

三、參考資料

•從wiki百科全書 開始,你可以了解到許多同狀態機相關的計算理論知識。

•狀態機是uml的乙個重要組成部分,robert c. martin在他的文章uml tutorial: finite state machines中,介紹了如何使用uml語言來對狀態機進行建模,你可以通過** 可以找到這一文件。

•qfsm也是乙個執行在linux下的狀態機建模工具,它不僅提供了視覺化的狀態機編輯器,而且還能夠對生成的狀態機進行實時模擬,通過** 可以了解到qfsm的更多資訊。

•為linux應用構造有限狀態機

C語言實現狀態機

狀態機有4個要素 舉例 state1是現態,state2是次態,event是條件,action是動作。當產生event時,觸發action,action執行完畢後從state1遷移到state2,此時,state2為現態。在這個例子中,action只是乙個瞬時執行的動作,它只在現態遷移到次態的過程中...

C語言 狀態機程式設計

狀態機原理 有限狀態機的工作原理如圖1所示,發生事件 event 後,根據當前狀態 cur state 決定執行的動作 action 並設定下乙個狀態號 nxt state fsm的實現方式 1 switch case或者if else 這無意是最直觀的方式,使用一堆條件判斷,會程式設計的人都可以做...

C語言狀態機程式設計

輸入一段字串,字串由字母和分隔符 空格,逗號,句號等 組成,寫乙個函式統計該字串中的單詞數。狀態 typedef enum count state t count state t 判斷函式 static intis end char ch static intis division char ch ...