看板 C_and_CPP 關於我們 聯絡資訊
恕刪。 這大概沒什麼知識,只是一些編碼問題。 一般情況下,是把你所有的 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
BlazarArc:感謝分享 03/12 19:17