推 BlazarArc:感謝分享 03/12 19:17
恕刪。
這大概沒什麼知識,只是一些編碼問題。
一般情況下,是把你所有的 function 都塞到 function pointer array 裡面去
假設有 4 bits, 代表要寫的有 16 (2^4) 個 function,這裡假設是 f0~f15。
同時也設一個 function pointer array 為 [16]。
程式碼大概就像這樣
typedef void (*fptr)(void);
fptr fun_arr[] = {f0,f1,f2,f3,....,f15};
再來編碼問題 LPH66 大在 programming 版有給解釋,詳閱。
偷懶一點的寫法 :
unsigned dec = opt0 | (opt1 << 1) | (opt2 << 2) | (opt3 <<3);
當然你也還可以再設 array 出來,原因是 GUI 上面的 optxxx
本身是被定義成 DWORD macro.
unsigned opt_ID[] = {CHECK_ID1, CHECK_ID2, CHECK_ID3, CHECK_ID4};
unsigned dec=0U;
for(i=0; i<sizeof(opt_arr)/sizeof(*opt_arr); ++i)
dec |= ( IsCheck( opt_ID[i] ) << i );
和上面 roll 開來的結果一樣。最後從 binary code 得到 dec code 後就簡單,
直接執行 fun_arr[dec] 即可。
func_arr[dec]();
程式碼參考如下。
http://ideone.com/aLiGJ
http://codepad.org/bUofR2Ee
裡面用到的 #define 全都看成是 void f1(){...} ~ void f15() {...} 就好。
比較麻煩的問題應該是,如果 function 型態不是每個都長得一樣怎麼辦?
可以有二種作法,一種是所有 function 自定義成
void func(void* );
維護下來比較麻煩。
另一種方式就直接用 C++ template 特性去解可能會好很多。
----
FSM 可以做,可以維護,但通常是拿來針對較大型、複雜問題時才會考慮用 fsm,
不然一般還是用 if-else 硬爆也爆完。
FSM 其實有軟體可以生成了,你只需丟一點 script 就行,
研究一下怎麼使用、生成出來的 code 有什麼特性即可。
http://www.nunnisoft.ch/nunnifsmgen/en/
--
我知道 ~ 但別說出來 ,
說出來讓人感到特別難過...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.195.165.40