Re: [問題] switch 的case 一定要常數??
看板C_and_CPP (C/C++)作者softwind (software everywhere)時間16年前 (2009/05/23 22:20)推噓3(3推 0噓 2→)留言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
05/24 01:10, 1F
→
05/24 01:11, , 2F
05/24 01:11, 2F
推
05/24 01:57, , 3F
05/24 01:57, 3F
推
05/24 03:00, , 4F
05/24 03:00, 4F
→
05/24 04:07, , 5F
05/24 04:07, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章