作者ric2k1 (Ric)
看板EE_DSnP
標題Re: [問題] 鍵盤mapping的問題
時間Wed Oct 20 21:34:09 2010
這個問題是目前 cmdReader-ref 的機制設計不良,
以前我是直接提供 compile 好的執行檔給大家,
但是對於不同的 keyboard mapping 這樣就不能用了...
今年想說把 charDef.*、cmdReader.cpp、以及 cmdParser.cpp 切乾淨,
想說提供給大家一個 cmdReader.o.ref 應該可以解決問題,
但是卻沒有注意到 pre-compile 好的 cmdReader.o.ref 事實上還是會 depend on
我自己的 charDef.h...
簡單的說,在 pre-compile 好的 cmdReader.cpp 裡面:
void
CmdParser::readCmdInt(istream& istr)
{
...
switch (pch) {
case LINE_BEGIN_KEY :
case HOME_KEY : moveBufPtr(_readBuf); break;
...
}
"case HOME_KEY" 還是去比較 pch 是否等於 "49 + 1 << 9",
所以如果你的 "checkChar()"
對於 Home key return 的 HOME_KEY 值 != "49 + 1 << 9"
那麼在 "make ref" 後的 cmdRead-ref 之中的這個 switch (pch)
就會找不到東西對應。
一個解決的辦法是:
請你在你的 charDef.h 裏頭對於 HOME_KEY 還是 define 成 "49 + 1 << 9"
而對於你自己的 HOME_KEY 的對應鍵 define 成別的 enum,比方說:
// assume your Home key = { 27 79 72 }
//
enum ParseChar {
...
MOD_KEY_FLAG = 1 << 9,
MOD_KEY_INT = 79, // 91,
HOME_KEY = 49 + MOD_KEY_FLAG,
HOME_KEY_MINE = 72,
...
};
然後在 charDef.cpp 裏頭 (舉例):
...
char key = mygetc(istr);
if (key == char(HOME_KEY_MINE) {
return HOME_KEY;
...
這樣我的 cmdReader-ref 就可以正確的運作,
而你的 code 也可以正常的執行。
當然,
因為我們在改作業的時候會用自己的 charDef.{h,cpp}
所以上述的問題對我們而言沒有關係,
不會因為你的 cmdReader-ref behave 不對而被扣分。
※ 引述《scuendless (scu)》之銘言:
: 想請問一下~
: 我原本已經寫好鍵盤的mapping
: 執行testAsc也ok
: 不過當我使用cmdReader-ref的時候
: 我的Home鍵跟End鍵卻沒辦法正常的使用
: (我的終端機中Home是27 79 72
: End 是27 79 70)
: 在testAsc下按下會跑出
: 27 79 72 Home key
: 27 79 70 End key
: 但在cmdReader-ref的時候
: 卻會變成輸出72與70的ASCII代號H,F
: 原本以為要是testAsc上面可以對應的話cmdReader-ref應該就可以
: 所以想請問一下是我mapping上自己沒寫好
: 還是怎樣呢~
: 謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.193.11.13
1F:推 scuendless:謝謝教授! 10/20 23:10