direkte Eingaben von der Tastatur in C

Post Reply
Message
Author
andy
Posts: 150
Joined: 07. Nov 1999 12:51
Location: Kiel
Contact:

direkte Eingaben von der Tastatur in C

#1 Post by andy »

Moin,

wie kann man in C direkte Eingaben von der Tastatur einlesen ohne
auf die Eingabe der return-Taste zu warten ?

Ciao, Andy

psychozapp
Posts: 85
Joined: 24. Jan 2000 14:28
Location: Nürnberg

Re: direkte Eingaben von der Tastatur in C

#2 Post by psychozapp »

Hallo,
versuch's doch mal mit den ncurses.
man curses
Damit kann man noch viel mehr so zeug machen.
Ciao, PsychoZapp (sprich seitcho sepp)


Grad fällt's mir noch ein:
Es gibt auch Slang, aber davon hab ich kaum
Ahnung. Ich weiß nur das es das Interface für
DOS und Linux gibt. Aber ich denke mit den
Curses bist du gut beraten.
Last edited by psychozapp on 29. Feb 2000 19:39, edited 2 times in total.

TuX

Re: direkte Eingaben von der Tastatur in C

#3 Post by TuX »

Diese Frage hat hier Phil am 02-Sep-1999 18:27:11 unter dem Titel "Anfängerfrage" schon einmal gestellt.
Hier ist ein Link auf diesen UltraBoard-Thread: <!--http--><a href="http://www.pro-linux.de/cgi-bin/UltraBo ... 04&Post=11" target="_blank">Artikel Nr. 11</a><!--url-->

Folgend ein Auszug aus der Pro-Linux C/C++ HOWTO:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
4.4. Eine Return-lose Eingabe realisieren ?

Q: Wie kann man mit C/C++ ein Eingabefeld realisieren, mit dem ohne
Bestaetigung mit Return ein Zeichen aufgenommen wird ?
Beispiel:

#include <iostream> // cout, cin

using namespace std;

//-----------------------------
int main(int argc, char** argv)
//-----------------------------
{
char EinZeichen;
cout << "Zeichen eingeben: " << endl;
cin >> EinZeichen; // Das hier nur eben OHNE RETURN
// wenn es geht
cout << "Zeichen war " << EinZeichen << endl;
return (0);
}

A: Die Standardbibliotheken sowohl von C als auch C++ arbeiten auf
Eingabe- und Ausgabe-Streams. Sonst gibt es nichts. Und das Terminal
ist dafuer zustaendig, beispielsweise eben den stdin-stream mit den
Tastatureingaben zu fuellen. Soweit bestens. Aber das tut so ein
Terminal nur zeilenweise nach bestaetigen mit Return. Demnach kann
man mit den stream-Geschichten nun mal beim besten Willen keine
solche return-lose Eingabe realisieren.
Statt dessen kann man aber was programmieren, was nicht ueber die
streams geht. Also direkt mit dem Terminal arbeitet.
Beispielsweise ncurses... kann da aber nicht aus eigener Erfahrung
reden, weil ich das noch nie selbst gemacht hab.
Aber mit sowas geht das zu machen.
</font><hr></pre></blockquote>

andy
Posts: 150
Joined: 07. Nov 1999 12:51
Location: Kiel
Contact:

Re: direkte Eingaben von der Tastatur in C

#4 Post by andy »

Mein Compiler kennt die Funktion getch() nicht. Wie kann ich in C (nicht C++) ungepuffert ein Zeichen einlesen ?

psychozapp
Posts: 85
Joined: 24. Jan 2000 14:28
Location: Nürnberg

Re: direkte Eingaben von der Tastatur in C

#5 Post by psychozapp »

Wie schon gesagt: NCURSES!

Das getch, das du meinst,ist in der conio.h definiert, die es <b>nur unter DOS</b> gibt.
In den <b>NCURSES gibt es auch ein getch()</b>, das du benutzen mußt.
(Oder du freundest dich mit Slang an.)

gz. PsychoZapp

andy
Posts: 150
Joined: 07. Nov 1999 12:51
Location: Kiel
Contact:

Re: direkte Eingaben von der Tastatur in C

#6 Post by andy »

int getkey(void)
{
int taste;
taste=getch();
if (taste == 0 || taste == 224)
{
taste=getch()+255;
}
return taste;
}

das ist jetzt nur das Unterprogramm, aber wenn ich das Programm compiliere,
bekomme ich die folgenden Meldungen. Die curses.h habe ich aber angegeben.
Warum klappt das nicht ?


in function 'getkey':
undefined reference to 'stdscr'
undefined reference to 'wgetch'
undefined reference to 'stdscr'
undefined reference to 'wgetch'

psychozapp
Posts: 85
Joined: 24. Jan 2000 14:28
Location: Nürnberg

Re: direkte Eingaben von der Tastatur in C

#7 Post by psychozapp »

Hi,

schein ein Linker Error zu sein.
(#include<?> vergessen bringt Compiler Errors)
Versuchs's mal mit -lncurses oder -lcurses.

Vielleicht geht's ja dann.

Was willst du überhaupt für eine Prog schreiben?

ciao PZ

andy
Posts: 150
Joined: 07. Nov 1999 12:51
Location: Kiel
Contact:

Re: direkte Eingaben von der Tastatur in C

#8 Post by andy »

Moin,

das mit -lcurses hat geklappt...nur wartet das Programm nicht auf einen Tastendruck, sondern gibt stumpf ein Zeichen aus. Ich hab' mal was mit drangehängt. Soll eigentlich nur ein stinknormaler Hexeditor werden...

/* gcc taste.c -otaste -lcurses */
#include <stdio.h>
#include <curses.h>
#include <ctype.h>

int getkey(void);
int main (void)

{
unsigned int taste=0;

while (taste!=27)
{
taste=getch();
printf("%c
",taste);
}
return 0;
}

psychozapp
Posts: 85
Joined: 24. Jan 2000 14:28
Location: Nürnberg

Re: direkte Eingaben von der Tastatur in C

#9 Post by psychozapp »

Ein Segfault wäre ebenso wahrscheinlich gewesen.

Schreib' mal bevor du getch() usw. benutzt in den Code:

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

Und zum Schluß:

endwin();

Ohne Initialisierung ist es klar, das nix geht. <img src="http://www.pro-linux.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

ciao und les' dir in Zukunft mal genauer durch was unter man curses kommt. <img src="http://www.pro-linux.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

psychozapp
Posts: 85
Joined: 24. Jan 2000 14:28
Location: Nürnberg

Re: direkte Eingaben von der Tastatur in C

#10 Post by psychozapp »

Ich hab grad meine "Verbesserungen" ausprobiert.

Du solltest nicht printf verwenden, wenn du mit den curses arbeitest. addch() echochar() und refresh() sind dafür besser geeignet, sonst kriegst du den Bildschirmoutput ein bischen zu spät.

Hier ein Prog von mir:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include<curses.h>

/* INIT PROCEDURE */
void initscreen(void)
{
initscr();
cbreak();
noecho();
nonl();
keypad(stdscr,TRUE);
}

/*-----------------------MAIN PROGRAM-------------------------*/
int main(void)
{
/* VARIABLES */
int ch;
char rch;
/* INITIAL */

initscreen();
/*-------------------------MAIN LOOP--------------------------*/
do {
ch=getch();
rch=ch;
printw("Sequence: %c Integer value: %i Char value: %i
",ch,ch,rch);
}
while (ch!='x');
/*-------------------------END OF PROG------------------------*/
endwin();
return 0;
}
</font><hr></pre></blockquote>

Post Reply