Beraldo 864 Denunciar post Postado Setembro 28, 2008 Eu preciso fazer um trabalho cuja funcionalidade depende da leitura das teclas, principalmente das setas. Para fins de testes, fiz este programa: #include <stdlib.h> #include <curses.h> int main() { int c, i = 1; initscr(); cbreak(); noecho(); do { c = getch(); clear(); printw("%d => ", i); switch (c) { case 65: printw("UP KEY"); break; case 68: printw("LEFT KEY"); break; case 66: printw("DOWN KEY"); break; case 67: printw("RIGHT KEY"); break; default: printw("Tecla inválida"); } printw(" %d ", c); refresh(); i++; } while (1); getch(); endwin(); return 0; } Ele funciona perfeitamente, porém, se eu trocar os números pelas respectivas constantes definidas em curses.h (KEY_UP, KEY_DOWN, KEY_LEFT e KEY_RIGHT), o programa não funciona. Vi no código dessa biblioteca, que as constantes são definidas com um zero na frente, o que, até onde sei, representa número octal. Supondo o exemplo de KEY_DOWN: #define KEY_DOWN 0402 /* down-arrow key */ (0402) na base 8 = (2 * 8^0 + 4 * 8^2 = 258) na base 10 258 != 66 :unsure: Isso está muito estranho. Outra coisa que percebi é que a variável i, que criei para controlar o número de teclas pressionadas, cresce de um em um para letras, de três em três para setas e de quatro em quatro para PAGEUP, DEL etc. Alguém sabe as respostas para isso tudo (ou pelo menos para uma delas)? :rolleyes: []s Beraldo Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Setembro 28, 2008 Tá incrementando errado porque você não está usando a ncurses do jeito certo. Se bem que é uma droga adivinhar o que tem que chamar o quê (e eu tive que fazer um editor de texto em ncurses...entao ja sofri bastante p/ adorar programas em GUI). int main() { int c, i = 1; initscr(); cbreak(); noecho(); WINDOW * this = initscr(); keypad(this,TRUE); do { c = wgetch(this); clear(); printw("%d => ", i); switch (c) { case KEY_UP: printw("UP KEY"); break; case KEY_LEFT: printw("LEFT KEY"); break; case KEY_DOWN: printw("DOWN KEY"); break; case KEY_RIGHT: printw("RIGHT KEY"); break; default: printw("Tecla inválida"); } printw(" %d ", c); refresh(); i++; } while (1); getch(); free(this); endwin(); Tenta agora. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Setembro 28, 2008 Ah, era simplesmente por causa das ausência de keypad()... Eu já tinha visto essa função, mas pensei que era somente para as teclas F1...F12 (exemplo em que vi o uso dessa função). Isso que dá não ler completamente as manpages: The keypad option enables the keypad of the user’s terminal. If en‐ abled (bf is TRUE), the user can press a function key (such as an arrow key) and wgetch returns a single value representing the function key, as in KEY_LEFT. A resposta esta aí... http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif Obrigado, de novo, Ísis []s Beraldo Compartilhar este post Link para o post Compartilhar em outros sites