Re: [問題] switch 的case 一定要常數??

看板C_and_CPP (C/C++)作者 (software everywhere)時間16年前 (2009/05/23 22:20), 編輯推噓3(302)
留言5則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《AGanPTT (阿干)》之銘言: : 如題 : 我寫了一個小遊戲 : 我本來都用 : #define Up 'H' : switch( Input ) : case Up: : dosomething(); : break; : ................... : 我想寫出能讓玩家自己選擇要哪些鍵當作上下左右等等... : 我試過int Up = 'H'; : 但switch的case compile都不會過 : 只有const int Up = 'H';才會過 : 要如何才能寫出更改按鍵 : 用if...else??? typedef void (*T_fp_action)(); typedef struct{ char Key; //按鍵 T_fp_action Action; //作啥動作? }T_key_action; //定義你的動作 here void goLeft() { /* ... */ } void goRight() { /* ... */ } void goForward( { /* ... */ } void goBack() { /* ... */ } // 建立你的table static T_key_action lookup_table[]={ {'w', goForward}, {'s', goBack}, {'a', goLeft}, {'d', goRight}, }; static bool b_table_inited=false; // 封裝你的table, #define _INNER_USE_ _INNER_USE_ static int _cmp_with_key_ (const void* pl, const void* pr){ return ((T_key_action*)pl)->Key - ((T_key_action*)pr)->Key; } _INNER_USE_ static void sortTable(){ qsort( loop_table, sizeof(lookup_table)/sizeof(lookup_table[0]), sizeof(lookup_table[0]), _cmp_with_key ); } // 提供針對table 專用的 API #define _EXT_USE_ _EXT_USE_ T_fp_action* searchAction(const char KEY){ if( b_table_inited==false ) { sortTable(); b_table_inited=true; } T_fp_action fp=bsearch(&KEY, lookup_table, sizeof(lookup_table)/sizeof(lookup_table[0]), sizeof(T_key_action), _cmp_with_key); return (fp==0)?(0):(fp->Action); } // how to use int main(){ char key=(-1); while( scanKey(&key) ){ T_fp_action* fp = search(key); if(fp==0) continue; //不是你有定義的key fp(); } return 0; } orz ... WHY? 我連review 都覺得痛苦... 比較: 如果使用 array來get func_ptr 複雜度 O(1); 但是缺點是 (可能會)浪費空間! 因為 array 必須連續 但事 不一定 每個key 都會有相對應動作 我寫的是用 pair< key, value>的方式 配合 qsort+bsearch 讓複雜度 變成 O(logN) 但是 不會浪費不需要的空間 done. so 看看摟 ps. 純C適用 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.122.157 ※ 編輯: softwind 來自: 118.166.117.186 (05/24 00:44)

05/24 01:10, , 1F
C++不行?? 如果要定義再CLASS裡怎麼設定初值
05/24 01:10, 1F

05/24 01:11, , 2F
我今天有試著去寫看看 但一直COMPILE錯誤
05/24 01:11, 2F

05/24 01:57, , 3F
C++更簡單啊...直接用map就好了
05/24 01:57, 3F

05/24 03:00, , 4F
呵呵 就是不會用MAP= = 等考試過後來研究研究好了
05/24 03:00, 4F

05/24 04:07, , 5F
我沒有說C++不能用阿 但是C++可以提供更好的技巧
05/24 04:07, 5F
文章代碼(AID): #1A60OxgA (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1A60OxgA (C_and_CPP)