狀態機的原理就不說了,先給出狀態機的轉換圖,很簡單
實現的思路是這樣的:
1、用函式指標表示狀態(狀態函式)。
2、狀態函式接受乙個引數(event),並根據event決定下乙個狀態。
3、狀態函式返回乙個函式指標,此函式指標的型別也是狀態函式指標。即狀態函式返回乙個指向下乙個狀態函式的指標。 4、
由於返回值是和原函式相同型別的函式指標,要定義成這樣
typedef func_ptr_t (*func_ptr_t)(int);
但是c語言中不允許這樣定義乙個函式指標。所以只能尋找變通的方法,這個方法就是強制型別轉換。我們可以按照以下方式定義
typedef void (*func_ptr_ret_t)(int);
typedef func_ptr_ret_t (*func_ptr_t)(int);
使用的時候進行強制型別轉換,將返回值轉換為func_ptr_t,這樣就實現了乙個能夠返回與原函式相同型別函式指標的函式。
func_ptr_t func;
func_ptr_t func2;
func = (func_ptr_t)func2(引數);
知道了這些後,就可以寫乙個簡單的狀態機了。
// 定義函式指標型別
typedef void (*state_ret)(int event);
typedef state_ret (*state)(int event);
// 申明狀態函式
state_ret state1(int event);
state_ret state2(int event);
state_ret state3(int event);
// 事件列表
enum event_num;
int main(void)
// 執行當前狀態函式,返回下一狀態函式指標,並儲存起來
curstate = (state)curstate(event);
i++;
}return 0; }
// 狀態1函式的實現
state_ret state1(int event)
// 返回下一狀態函式指標
return curstate; }
// 狀態2函式實現
state_ret state2(int event)
return curstate; }
// 狀態3函式實現
state_ret state3(int event)
return curstate; }
C語言實現有限狀態機
在實際工作中,經常遇到狀態機的應用,尤其在網路協議部分,最為經典的就是tcp協議的狀態機 實際上,很多網路協議都是有工作狀態的,不同階段所處不同的狀態,例如dhcp協議,路由協議,sip協議等等。這些協議在實現的時候多多少少會用到狀態機的原理,可能在實現上有較大的差別。我原來只是聽說過有這個原理,但...
有限狀態機的實現
有限狀態機 finite state machine或者finite state automata 是軟體領域中一種重要的工具,很多東西的模型實際上就是有限狀態機。最近看了一些遊戲程式設計ai的材料,感覺遊戲中的ai,第一要說的就是有限狀態機來實現精靈的ai,然後才是a 尋路,其他學術界討論比較多的...
PSF 有限狀態機的實現方法
1 switch case if else設計方法 curevent getevent curstate getcurstate switch curstate break 這種設計方法最簡單,通過一大堆判斷來處理,適合小規模的狀態切換流程,但如果規模擴大難以擴充套件和維護。2 基於表結構的狀態機設...