整理 一種有限狀態機的C語言實現

2021-07-15 20:07:41 字數 1368 閱讀 8184

狀態機的原理就不說了,先給出狀態機的轉換圖,很簡單

實現的思路是這樣的:

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 基於表結構的狀態機設...