• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Sion

Arrow input

15 mensagens neste tópico

Boas

Gostava de saber se existe alguma forma de ler em C, o input de setas, tal como os outros caracteres todos.

O que li foi que os valor ANSII das setas eram :   

* 37(left arrow)

* 38(up arrow)

* 39(right arrow)

* 40(down arrow)

cumps

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em C sem extensões (Standard C) não é possível.

Se não te importares de usares extensões e limitar o teu programa a ambientes que usem essas extensões, vê por exemplo <curses.h> (extensão POSIX) ou <conio.h> (extensão MSDOS).

Também deve haver uma extensão específica para Windows, mas não sei qual é.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ja exprimentei o conio, mas nao sei porque ele nao da problemas com a biblioteca mas quando as suas funcoes da erro na compilação :S

tou a usar o VC 2008

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já que falaste em <conio.h> experimenta este programeta (não testado)

#include <conio.h>
#include <stdio.h>
int main(void) {
  puts("control-c to exit");
  for(; printf("%02x\n", getch());
  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já que falaste em <conio.h> experimenta este programeta (não testado)

#include <conio.h>
#include <stdio.h>
int main(void) {
  puts("control-c to exit");
  for(; printf("%02x\n", getch());
  return 0;
}

se era suposto premir control C para sair, comigo nao funcionou lol

Ja percebi mais ou menos como funciona a entrada das setas com o getch(), mas quando eu verifico que valor é que ele recebe com as minha "seta cima" "seta baixo" e etc, o valor é sempre o mesmo 224. :s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se era suposto premir control C para sair, comigo nao funcionou lol

LOL, sorry! Talvez Ctrl+Break?

Ja percebi mais ou menos como funciona a entrada das setas com o getch(), mas quando eu verifico que valor é que ele recebe com as minha "seta cima" "seta baixo" e etc, o valor é sempre o mesmo 224. :s

A ideia que eu tenho de há muito, *muito* tempo, é que o getch() devolve as setas em dois caracteres: o primeiro para indicar que foi premida uma tecla 'especial' (talvez 0 (zero) ou o 224) e o segundo para determinar qual foi a tecla especial (UP, DOWN, ... HOME, PAGEDOWN, INSERT, F1, F2, ...)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

LOL, sorry! Talvez Ctrl+Break?

lol assim já funciona xD.

A ideia que eu tenho de há muito, *muito* tempo, é que o getch() devolve as setas em dois caracteres: o primeiro para indicar que foi premida uma tecla 'especial' (talvez 0 (zero) ou o 224) e o segundo para determinar qual foi a tecla especial (UP, DOWN, ... HOME, PAGEDOWN, INSERT, F1, F2, ...)

existe alguma maneira de ler apenas o segundo caracter devolvido?, é que se fizer a=getch(), ele devolde sempre  244, e o que eu queria era o segundo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

existe alguma maneira de ler apenas o segundo caracter devolvido?

Completamente não testado (se calhar tens que mudar o valor do #define para 0 ou outro)

#include <conio.h>
#include <stdio.h>
#define PREFIXO_TECLA_ESPECIAL 224

int main(void) {
  puts("Control+Break para sair");
  for(; {
    int ch = getch();
    if (ch == PREFIXO_TECLA_ESPECIAL) {
      printf("Tecla 'especial': %02x\n", getch());
    } else {
      printf("Tecla normal: %02x\n", ch)
    }
  }
  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Completamente não testado (se calhar tens que mudar o valor do #define para 0 ou outro)

#include <conio.h>
#include <stdio.h>
#define PREFIXO_TECLA_ESPECIAL 224

int main(void) {
  puts("Control+Break para sair");
  for(; {
    int ch = getch();
    if (ch == PREFIXO_TECLA_ESPECIAL) {
      printf("Tecla 'especial': %02x\n", getch());
    } else {
      printf("Tecla normal: %02x\n", ch)
    }
  }
  return 0;
}

funciona, a unica diferenca e que o numero que me da na condicao 'tecla especial'  sao uns tipo 4d e 4b , ja agora o que é "%02x"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que é "%02x"

É a maneira que o printf() tem para apresentar o resultado em hexadecimal. Podias muito bem imprimir normalmente com "%d" :)

#include <stdio.h>
int main(void) {
  int k;
  for (k=0; k<256; k++) {
    printf("%d=%02x  ", k, k);
    if (k % 8 == 7) putchar('\n');
  }
  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Existe alguma maneira de verificar o valor hex de uma varivel, tipo no switch ou no if

por exemplo se puser switch(ch), para verificar o valor hex do ch?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes escrever constantes dentro do código em decimal ou hexadecimal

/* ... */
int fortytwo = 42;
unsigned long int deadbeef = 0xdeadbeef;
if (fortytwo == 0x2a) puts("YAY!");
if (deadbeef == 3735928559UL) puts("YAY!");
/* ... */

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que arranjei uma maneira xD, o unico problema é que nao sei se deve funcionar com todos os teclado ou algo do genero

#include <conio.h>
#include <stdio.h>
#define PREFIXO_TECLA_ESPECIAL 224

int main(void) {

printf("Prima uma seta direcional\n");
printf("Prima Control+Break para sair\n");
while(1){
int i;
getch(); //este getch é dispensavel 
i=getch();
switch(i)
{
case 75 : printf("Esquerda\n");break;
case 77: printf("Direita\n");break;
case 72: printf("Cima\n");break;
case 80: printf("Baixo\n");break;
}
  

}
  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que arranjei uma maneira xD, o unico problema é que nao sei se deve funcionar com todos os teclado ou algo do genero

Experimenta carregar em H, K, M, ou P (maiusculo) no teu programa! :)

o getch() que dizes ser dispensável é absolutamente indispensável: é ele que detecta se a tecla que o utilizador acabou de carregar é especial ou não.

Quanto a funcionar em todos os teclados ou algo no género, não me parece.

Por exemplo, no meu computador não funciona ... nem sequer tenho o conio.h disponível.

Talvez experimente umas coisas para ver como é que as teclas especiais se comportam aqui ...

Edit

#include <curses.h>

int main(void) {
  int ch;

  /* The whole program needs error-checking */
  initscr();
  noecho();
  cbreak();
  printw("Hit Ctrl+C to exit ...\n\n");
  for (; {
    ch = getch();
    printw("Value of char: %d (%02x)\n", ch, ch);
  }
  endwin();
  return 0;
}

Com o código acima, quando carrego UP, DOWN, LEFT, RIGHT, o que me aparece é (linhas em branco inseridas à pata):

Hit Ctrl+C to exit ...

Value of char: 27 (1b)

Value of char: 91 (5b)

Value of char: 65 (41)

Value of char: 27 (1b)

Value of char: 91 (5b)

Value of char: 66 (42)

Value of char: 27 (1b)

Value of char: 91 (5b)

Value of char: 68 (44)

Value of char: 27 (1b)

Value of char: 91 (5b)

Value of char: 67 (43)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No meu programa pelo menos comigo ele nao le nada se nao as setas :s lol

Com o programa que tens ai nao sei porque nao tenho a curses.h

edit: ahh lol ja percebi, tao é como o wasd xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora