2014-06-26 44 views
3

我有一個軟件狀態機,通過事件驅動的函數調用使用。即,我有一個狀態機柄一個struct包含表示當前狀態的函數指針:面向對象的C有限狀態機

typedef struct pHandle_t pHandle_t; 
typedef void(*pState_f)(pHandle_t *pHandle, pEvent_t pEvent); 
struct pHandle_t 
{ 
    pState_f curState; 
    void *contextPtr;  // Is this needed? 
}; 

每個狀態然後通過使用帶手柄本身的功能和事件作爲輸入表示:

static void SM_Init(pHandle_t *pHandle, pEvent_t pEvent); 

在每個函數中,pEvent上都有一個開關/外殼,通常會產生一些動作,並更改curState函數指針以更改爲表示狀態的函數。所有這些代碼工作得很好,同時使用全局變量來確定何時完成某些狀態更改。 (這種類型的方法顯然不適用於函數實例化變量試圖知道何時停止)。但是,爲了減少全局變量和函數,我希望實現更多的面向對象的方法,以便在狀態機達到完整狀態時全局變量和指令內存消失。我知道有幾個例子說明如何在普通C中使代碼看起來像面向對象,但這裏的齒輪有一個扳手:外部模塊需要能夠發送事件給這個狀態機,而不需要指向狀態機的句柄。我怎樣才能做到這一點,而不需要將整個狀態機對象聲明爲全局的(這完全違背了一次我試圖釋放所有空間的原始意圖)?

如果這些措辭有些令人困惑,我很抱歉。我相信這是一個非常有用的話題,所以我會按照要求重新說明,但請在低估我之前發表評論......在任何人問起之前,現有的代碼庫都是C語言,並且暗示C++儘管做出了我的全部努力,但卻充耳不聞。

+0

「外部模塊需要能夠將事件發送到這個狀態機,而無需一個指向狀態機處理。」 … 他們有什麼?如果模塊無法在不同的狀態機之間進行選擇,則只能有一個單例。 – Potatoswatter

+0

限制似乎是任意的。爲什麼外部模塊不能通過'create_state_machine'函數獲得指針? –

+0

@Patatoswatter:在這種情況下,你提出了一個很好的觀點,對於我的特殊用例,它只會是一個singleton,但我想要考慮如何回答singleton和non-singleton。將更新問題。 – SeaNick

回答

3

這可能是一個可怕的想法,但同樣地,這可能有助於說服同伴讓你在需要的地方存儲一個小小的指針。

如果你只需要識別狀態機對象的實例就是回調函數指針,那麼爲了讓多個機器運行,你需要重複所有的函數,以便不同的指針可以在功能上相同,但是比較當投射到char *時不同。

因此,對於兩臺機器,您需要將代碼大小加倍。三臺機器:三臺。等

<不寒而慄>

+0

這正是我正在尋找的基本原理類型,因爲我越多考慮它,我越會意識到句柄指針總是會以最便宜的方式完成,而無需分配內存映射的某些固定部分只是爲了這個對象。 – SeaNick