Avatar billede thomas_nj Nybegynder
21. oktober 2004 - 16:29 Der er 6 kommentarer og
1 løsning

kbhit og getch under linux

Hej

  Hvilke funtioner er linux's svar på kbhit og getch under windows. Og hvilke headerfiler ligger de i?
Avatar billede arne_v Ekspert
21. oktober 2004 - 16:35 #1
Der er ikke umiddelbart helt tilsvarende.

De fleste med behovet bruger nok curses.

Diverse hacks eksisterer,

Google fandt bl.a.:
  http://www.control.auc.dk/~jnn/c2000/programs/mm5/keyboardhit/msg02541.html
Avatar billede thomas_nj Nybegynder
21. oktober 2004 - 16:44 #2
Skal jeg linke imod et eller andet for at få <termios.h> til at virke?
Avatar billede arne_v Ekspert
21. oktober 2004 - 16:46 #3
Godt spørgsmål.

Prøv man på de funktioner der kaldes og læs hvad der står.
Avatar billede thomas_nj Nybegynder
21. oktober 2004 - 16:56 #4
Fandt selv denneher på google:

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <term.h>
#include <curses.h>
#include <unistd.h>

static struct termios initial_settings, new_settings;
static int peek_character = -1;

void init_keyboard();
void close_keyboard();
int kbhit();
int readch();

int main()
{
int ch = 0;

init_keyboard();
while(ch != 'q') {
printf("looping\n");
sleep(1);
if(kbhit()) {
ch = readch();
printf("you hit %c\n",ch);
}
}
close_keyboard();
exit(0);
}

void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}

void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}

int kbhit()
{
char ch;
int nread;

if(peek_character != -1)
return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);

if(nread == 1) {
peek_character = ch;
return 1;
}
return 0;
}

int readch()
{
char ch;

if(peek_character != -1) {
ch = peek_character;
peek_character = -1;
return ch;
}
read(0,&ch,1);
return ch;
}

Koden virker men er den optimalt kodet?
Avatar billede arne_v Ekspert
21. oktober 2004 - 17:08 #5
De fleste eksempler man finder på nettet ligner det her, så monstro ikke
at der er måden at gøre det på.
Avatar billede thomas_nj Nybegynder
21. oktober 2004 - 17:08 #6
ok, mange tak for hjælpen, gider du svare?
Avatar billede arne_v Ekspert
21. oktober 2004 - 17:10 #7
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester