[C linux] Input van toetsen bord

Pagina: 1
Acties:

  • RHE123
  • Registratie: April 2003
  • Nu online
Hoe kan je in C het volgende doen:
while(<toetsenbord_input> != 'q') {
<hoop_opdrachten>;
}

Alleen dan dat hij constant die opdrachten doet, totdat er q ingedrukt word, op deze manier moet je elke keer input geven (!= q).

Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro


Verwijderd

Dit kan volgens mij niet met een standaard-c functie, maar onder Linux kan de misschien select() gebruiken om te kijken of er een toets is ingedrukt.

Wat je wil heet "non-blocking i/o", misschien kan je daaronder zoeken.

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

had iets getyped maar kan niet...

[ Voor 79% gewijzigd door H!GHGuY op 03-01-2004 17:30 . Reden: fout ]

ASSUME makes an ASS out of U and ME


  • RHE123
  • Registratie: April 2003
  • Nu online
Verwijderd schreef op 03 januari 2004 @ 17:18:
Dit kan volgens mij niet met een standaard-c functie, maar onder Linux kan de misschien select() gebruiken om te kijken of er een toets is ingedrukt.

Wat je wil heet "non-blocking i/o", misschien kan je daaronder zoeken.
Zal vanavond gaan zoeken, als iemand anders tijd heeft >:) ;)

Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro


Verwijderd

google: 'kbhit linux':

http://www.google.com/sea...d=navclient&q=kbhit+linux


eerste resultaat:

http://linux-sxs.org/programming/kbhit.html

denk dat je daar aardig ver mee komt.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 22-02 22:40
Wat probeer je dan te programmeren, want in het algemeen is dit een niet-zo-goede manier van flow control (i.e. het gaat niet lekker compatible zijn met andere UNIX tools).

Je kunt een programma sowieso altijd afbreken met Ctrl-C, en daar hoef je dan verder ook niet allerlei vreemde dingen voor te doen...

Verwijderd

Poll of select

Ik heb nog nooit van kbhit gehoord, beetje vreemd om dan gelijk "Google!" te roepen.

  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

Verwijderd schreef op 03 januari 2004 @ 17:18:
Wat je wil heet "non-blocking i/o", misschien kan je daaronder zoeken.
Wat de TS wil is een non line-buffered terminal. Met blocking IO heeft dit probleem niks te maken. Met tcgetattr() / tcsetattr() kun je de diverse terminal modes zetten.

Voor degenen die echt gehecht zijn aan DOS : Er zijn wat ports van de Borland conio funties, wat zoekwerk op google zou deze snel tevoorschijn moeten toveren.

[ Voor 25% gewijzigd door igmar op 04-01-2004 00:28 . Reden: typos ]


Verwijderd

het probleem is dat indien je van de terminal leest alles per line gebufferd wordt en je (denk ik) met poll/select ook niet veel verder komt. Eerst moet je je terminal aanpassen dat ie per characters leest en niet per line, is heel simpel (heb het ooit gedaan) maar kan je nu niet zomaar zeggen hoe het gaat. :|

  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

Waarmee je nog steeds de input per regel krijgt. En het nut van de poll / select is in deze ?

  • RHE123
  • Registratie: April 2003
  • Nu online
Ik denk dat de oplossing toch in deze post zit :*)
Ik heb namelijk dit uit het eerste resultaat uitgevoerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
kbhit() is not available on Linux (UNIX), it is a DOS function.
Below is some code (functions) to replace the "kbhit" functionality (this
code is from a book called "Beginning Linux Programming", from Wrox Press
-- www.wrox.com -- you can download the Code Examples from the Book at
this Site):


CCODE
 /********************************************************************/


KBHIT.H

#ifndef KBHITh
 #define KBHITh
 
void   init_keyboard(void);
 void   close_keyboard(void);
 int      kbhit(void);
 int     readch(void); 

#endif 

KBHIT.C 

#include "kbhit.h"
 #include <termios.h>
 #include <unistd.h>   // for read()
 
static struct termios initial_settings, new_settings;
 static int peek_character = -1;
 
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()
 {
 unsigned 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;
 }


De functie kbhit() heb ik dus in mijn file gezet, en ik controleer met
code:
1
while (!kbhit()){
of er nog niet is gedrukt.

Nu heb ik nog 2 problemen:
- Hoe kan ik controleren of er op de q is gedrukt en niet op een andere toets?
(- Hoe zorg ik ervoor dat na het uitvoeren van het programma de instellingen van de terminal weer normaal zijn, door die kbhit word namelijk ingesteld dat er geen enters meer voorkomen in de terminal en ook word er niks meer geecho'ed. Dat is dus erg lastig met een opdracht intypen, omdat je dus niks ziet behalve:
[code][user@localhost map]#
[/code])

Al opgelost, door de functies init_keyboard(); en close_keyboard(); toe te voegen 8)7 dom,dom (had alleen close_keyboard gedaan)

Nu dus alleen probleem 1 nog.

[ Voor 13% gewijzigd door RHE123 op 04-01-2004 12:30 ]

Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
als je die kbhit true terug geeft kun je controleren met de readch of er een q terug wordt gegeven.
code:
1
2
3
4
5
6
while(true) {
  if (kbhit()) {
    if (readch()==int('q')) break;
  }
//  rest van de code
}


offtopic:
begint trouwens meer op een p&w vraagje te lijken

  • RHE123
  • Registratie: April 2003
  • Nu online
Shadowman schreef op 04 januari 2004 @ 12:39:
als je die kbhit true terug geeft kun je controleren met de readch of er een q terug wordt gegeven.
code:
1
2
3
4
5
6
while(true) {
  if (kbhit()) {
    if (readch()==int('q')) break;
  }
//  rest van de code
}


offtopic:
begint trouwens meer op een p&w vraagje te lijken
Thnx, ik heb hem nu werkend >:)

edit: Met welke opdracht kan ik eigenlijk het script beeindigen, want break (zoals hier in de code) werkt niet. Het gaat dus om het hele script, en niet een loop ofzo.

[ Voor 21% gewijzigd door RHE123 op 04-01-2004 14:14 ]

Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

C != script, dat ten eerste.

Verder, basis C kennis:
code:
1
exit(int code);

All my posts are provided as-is. They come with NO WARRANTY at all.


  • RHE123
  • Registratie: April 2003
  • Nu online
CyBeR schreef op 04 januari 2004 @ 16:25:
C != script, dat ten eerste.

Verder, basis C kennis:
code:
1
exit(int code);
Dat d8 ik dus ook, maar hij scheid er mooi niet mee uit 8)7

Ik werk onder linux (weet niet of dat uitmaakt..), en wat kan je voor int invoeren?


Het is al gelukt, had exit op de verkeerde plek aangepast :X

[ Voor 11% gewijzigd door RHE123 op 04-01-2004 17:13 ]

Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro

Pagina: 1