天天看點

狀态機實作c語言多級菜單,用C語言實作分層狀态機

我對如何實作我的狀态機感到有點困惑.

我已經知道它是分層的,因為一些州共享相同的行動.

我通過這些參數确定我需要做什麼:

>類(值為:基數,派生,特定)

> OpCode

>參數1 – 可選

>參數2 – 可選

我的層次結構由Class決定,OpCode表示操作.

Derived可以使用Base的OpCodes和Specific可以使用Base和Derived的OpCodes.

天真的實作如下:

void (*const state_table [MAX_CLASSES][MAX_OPCODES]) (state *) {

{base_state1, base_state2, NULL, NULL},

{base_state1, base_state2, derived_state1, NULL},

{base_state1,base_state2, derived_state1, specific_state3},

};

void dispatch(state *s)

{

if (state_table[s->Class][s->OpCode] != NULL)

state_table[s->Class][s->OpCode](s);

}

這将變得難以維持.

還有另一種方法将狀态映射到超類嗎?

編輯:

進一步的計算讓我覺得我可能會使用大部分(如果不是全部)操作碼,但我不會使用所有可用的類.

另一個澄清:

某些OpCode可能通過多個派生類和基類共享.

例如:

>我有一個名為Any的類

這是一個基類.它有

操作碼:STATE_ON,STATE_OFF,STATE_SET.

>我有另一個叫做的課

MyGroup是一個Derived類.它有OpCodes:

STATE_FLIP,STATE_FLOP.

>第三類是具體的

類稱為ThingInMyGroup

有OpCode:

STATE_FLIP_FLOP_AND_FLOOP.

是以,從伺服器發送包含Any類的消息,在所有用戶端中接收并處理.

從伺服器發送帶有MyGroup類的消息,在所有用戶端中收到并僅在屬于MyGroup的用戶端上處理,任何對Any類有效的OpCode對MyGroup類都有效.

從伺服器發送帶有ThingInMyGroup類的消息,在所有用戶端中收到并僅在屬于MyGroup的用戶端上處理并且是ThingInMyGroup *,任何對Any類和MyGroup類有效的** OpCode對ThingInMyGroup類都有效.

收到消息後,用戶端将相應地ACK / NACK.

我不喜歡使用switch case或const數組,因為當它們變大時它們将變得不可維護.

我需要一個靈活的設計,讓我:

>指定可用的OpCode

每個班級.

>為每個Class指定一個超類,并通過該規範允許我調用目前OpCode表示的函數指針.