Avatar billede tangveje Nybegynder
03. marts 2003 - 11:46 Der er 7 kommentarer og
1 løsning

Fange tryk på tast med GCC

Jeg fik engang bikset denne kode sammen, til at fange hvilken tast der blev trykket på. Den virkede fint den gang (under Windows med Dev-C++), men jeg kan ikke helt få den til at virke under Linux med GCC.

char key ;
 
while (key != 'e') {
  if ( kbhit() ) {
    key = getch(); 
    cout << key ;
  }
}

Mit problem lader til at være at jeg skal bruge conio.h header filen for at få koden til at virke... Jeg har så prøvet med følgende 3 linier (ikke samtidigt altså :)

#include <conio>

#include <conio.h>

#include <cconio>

Men får blot at vide at filen ikke eksisterer. Så derfor vil jeg høre om nogen her kan omskrive den, på en eller anden måde.

På forhånd tak :)
Avatar billede arne_v Ekspert
03. marts 2003 - 11:57 #1
kbhit+getch+conio.h er DOS specifikke.

Funktionaliteten kan dog laves i de fleste andre operativ-systemer også.

[men jeg ved ikke hvordan man gør i Linux]
Avatar billede emileej Nybegynder
04. marts 2003 - 13:32 #2
kbhit og getch er ikke DOS specifikt - _kbhit og _getch er. Man bruger også kbhit og getch på Linux - ved bare ikke hvad du skal include...
Avatar billede tangveje Nybegynder
04. marts 2003 - 13:43 #3
Med google lykkedes det mig at finde ncurses nævnt nogen gange i denne forbindelse. Det var dog voldsomt sparsomt med oplysninger, for slet ikke at snakke om eksempler :( Er vist ikke noget folk bruger særligt ofte
Avatar billede arne_v Ekspert
04. marts 2003 - 13:48 #4
curses er et standard text screen bibliotek, som kan fåes
til næste alle platforme inklusive Unix og DOS.

Den funktionalitet du efterspørger kan meget vel tænkes at ligge
i curses.

Jeg har hørt om ncurses før, men jeg kan ikke huske om det
bare er en curses implementation eller det er en decideret
udvidelse af curses.
Avatar billede tangveje Nybegynder
04. marts 2003 - 15:49 #5
Lidt mere googling og nogle eksperimenter, og jeg sidder nu med noget der ser næsten rigtigt ud

#include <iostream>
#include <curses.h>

using namespace std ;

int main( ) {

  initscr( ) ;
  cbreak( ) ;
  noecho( ) ;
  keypad( stdscr, TRUE ) ;
  nodelay( stdscr, TRUE ) ;

  int key ;

  for ( ;; ) {
    if ( ( key = getch( ) ) == ERR ) {
      continue ;
    } else {
      cout << key << endl ;

      if ( key == 1 ) {
        break ;
      }
    }
  }

  endwin( ) ;
}

Med lidt hjælp fra http://www.apmaths.uwo.ca/~xli/ncurses.html

Men der er bare et problem, som jeg håber i kan hjælpe mig med... Det er som om der tilføjes en \t for hver gang man trykker på en tast, så resultatet ser ud i stil med dette

42
    43
        44

Istedet for blot

42
43
44
Avatar billede arne_v Ekspert
04. marts 2003 - 16:15 #6
Prøv og drop cout til output !

Enten skriv til fil eller brug også curses funktioner
til output.

En blanding af curses og cin/cout/stdin/stdout er
ikke godt.
Avatar billede tangveje Nybegynder
04. marts 2003 - 16:26 #7
Så tror jeg det lykkedes :) Tak for hjælpen
Avatar billede emileej Nybegynder
04. marts 2003 - 17:56 #8
Kanske endl adder "\n\t" i stedet for bare "\n"? :)
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