2008年2月18日 星期一

[原創]state event action 框架



寫程式時如果是使用事件驅動, 很可能會有狀態轉移的問題。
即(1)輸入事件,(2)輸入現在狀態,(3)執行動作。
反?到程式上應該會有很多做法。
譬如使用慢吞吞的 switch case,時間複雜度為 O(E*S),E 為輸入事件,S為現在狀態
有沒有方法可以變成 O(1)呢?
使用查表法應可以達成。

前提是:狀態和事件一定要連續
使用二維函數指標可達成此要求
在下的實踐方式如下:


#include <cstdlib>
#include <cstdio>

using namespace std;

#define STATE_SIZE 5
#define EVENT_SIZE 5

//定義狀態
enum STATE
{

ST0 = 0,ST1 = 1,ST2 = 2,ST3 = 3,ST4 = 4

};

//定義事件
enum EVENT
{

EVENT0 = 0,EVENT1 = 1,EVENT2 = 2,EVENT3 = 3,EVENT4 = 4

};


//定義2維指標陣列
typedef void (*action)(void);
action actions[STATE_SIZE][EVENT_SIZE];

//隨便定幾個函數來測試
void no_fun(void)
{

printf("no_fun\n");
}


void
fun1_1(void)
{


printf("fun1_1\n");
}


void
fun2_1(void)
{

printf("fun2_1\n");
}


void
fun1_3(void)
{

printf("fun1_3\n");
}


void
fun4_4(void)
{


printf("fun4_4\n");
}



int
main(int argc, char *argv[])
{


int
i,j;
for
(i=0;i<STATE_SIZE;i++)
{


for
(j=0;j<EVENT_SIZE;j++)
{

actions[i][j] = &no_fun;
}
}


//把函數指上去
actions[1][1] = &fun1_1;
actions[2][1] = &fun2_1;

actions[1][3] = &fun1_3;
actions[4][4] = &fun4_4;

//call 幾個函數看看
actions[ST1][EVENT1]();
actions[ST2][EVENT1]();

actions[ST1][EVENT3]();
actions[ST4][EVENT4]();
actions[ST1][EVENT0]();

system("PAUSE");
return
EXIT_SUCCESS;
}




執行結果:
-----------------
fun1_1
fun2_1
fun1_3
fun4_4
no_fun


沒有留言: