參考資料:
http://blog.csdn.net/v__king__/article/details/71740492 [狀態(tài)機(jī)實(shí)現(xiàn)的三種方法-C語(yǔ)言]
http://blog.csdn.net/findaway123/article/details/16870927有限狀態(tài)機(jī)在程序設(shè)計(jì)中作用和意義
為什么要用狀態(tài)機(jī),狀態(tài)機(jī)常用于哪里
1.過(guò)多的if else帶來(lái)結(jié)構(gòu)的過(guò)于復(fù)雜
2.改變傳統(tǒng)的'遵循事先設(shè)定的邏輯,從頭到尾地執(zhí)行',可以處理任何順序的事件,并能提供有意義的響應(yīng)——即使這些事件發(fā)生的順序和預(yù)計(jì)的不同。有限狀態(tài)機(jī)正是為了滿足這方面的要求而設(shè)計(jì)的菜枷。
3.各種通信協(xié)議發(fā)送方和接受方傳遞數(shù)據(jù)時(shí),一個(gè)字節(jié)一個(gè)字節(jié)接收比對(duì)(下例類似)
4.自底向上解析語(yǔ)法的parser
5.飲料機(jī)(數(shù)電課本)
6.正則中關(guān)鍵字過(guò)濾,可以用有限自動(dòng)機(jī)推導(dǎo)正則表達(dá)式
說(shuō)了這么多迁筛,看看實(shí)例吧
實(shí)例:從FLAG中取出想要的那一幀數(shù)據(jù)
void found()
{ unsigned char myptr=0;
int mypage=256;
unsigned char i =0;
unsigned char my_tx_buffer[170];
unsigned char want_day[6];//年
unsigned char address[6];
unsigned char cur_state=0;
unsigned char nxt_state=0;
for(unsigned i=0;i<170;i++)
my_tx_buffer[i]=0;
//如果我要找2018年1月31日12點(diǎn)24分24秒的信息
want_day[0]=0x19;
want_day[1]=0x01;
want_day[2]=0x31;
want_day[3]=0x12;
want_day[4]=0x24;
want_day[5]=0x24;
//
mypage=256; //數(shù)據(jù)存于256頁(yè)至1024頁(yè)
while(1)
{
ReadMemory(address,6,mypage,myptr); //于mypage頁(yè)myptr字節(jié)處讀取至address
cur_state = nxt_state;
switch(cur_state) //狀態(tài)0,剛進(jìn)入查詢
{
case 0: //在s0狀態(tài)
if(address[0]==want_day[0]) //如果年份一樣耕挨,那么就執(zhí)行a1動(dòng)作细卧,并將狀態(tài)轉(zhuǎn)移到s1態(tài);
{ nxt_state = 1; }
else
break;
case 1: //在s1狀態(tài)
if(address[1]==want_day[1]) //如果月份符合
{ nxt_state = 2; }
else
break;
case 2: //在s2狀態(tài)
if(address[2]==want_day[2]) //如果日符合
{nxt_state = 3;}
else
break;
case 3: //在s3狀態(tài) 符合數(shù)據(jù) 取出并保存
for( i=0;i<6;i++)
my_tx_buffer[i]=address[i];
nxt_state = 0 ;
goto solve;
default:break;
}
myptr+=73;
if(myptr>73)
{myptr=0;
mypage++;
}
if(mypage>1024)
{
mypage=256;
goto solve;
}
}
solve: //后續(xù)處理
myptr=0;
}