Weiter mit beliebiger taste...
-
Oder schau einfach mal in der Konsolen-FAQ unter "Automatisches Schließen verhindern", dort findest du auch eine standardkonforme Lösung.
MfG SideWinder
-
Leider ist sind die beiden Lösungen noch nicht der Schlüssel zu meinem Problem.
kbhit() wird von meinem Compiler nicht unterstützt (oder fehlt mir da wohlmöglich eine Includedatei?) ausserdem sollte es möglichst Kompilerunabhängig sein, da ich das Programm in der UNI abgeben muß. ich benutze gcc 3.2
Automatisches schliessen (http://www.c-plusplus.net/forum/topic,39328.html) bringt mich auch nicht weiter, da ich mit dem Prog leider nicht auf
"Weiter mit BELIEBIGER Taste" komme. ein Abbruch von wait findet nur mit enter/zeilenumbruch statt. Einen Abbruch mit beliebiger Taste war mir nicht möglich, da getchar immer auf enter als Eingabeende wartet. Die nicht sofort ausgelesenen Zeichen werden gepuffert...
Im Raum steht noch die Idee, system(pause) einzubauen, was allerdings unter linux wenig bringt.Bin gespannt auf weitere Ideen und vielen dank erst einmal für die überlegungen.
-
Warum brauchst du das denn unbedingt? Bei Uni-Dingen steht normalerweise das Innere des Programms, die Algorithmen, das Design etc. im Vordergrund, nicht die Gestaltung der Bedienerführung. Im Standard (und damit compilerunabhängig) gibt es jedenfalls keine Möglichkeit, auf einen beliebigen Tastendruck zu warten.
-
happyaura schrieb:
Leider ist sind die beiden Lösungen noch nicht der Schlüssel zu meinem Problem.
kbhit() wird von meinem Compiler nicht unterstützt (oder fehlt mir da wohlmöglich eine Includedatei?) ausserdem sollte es möglichst Kompilerunabhängig sein, da ich das Programm in der UNI abgeben muß. ich benutze gcc 3.2
Automatisches schliessen (http://www.c-plusplus.net/forum/topic,39328.html) bringt mich auch nicht weiter, da ich mit dem Prog leider nicht auf
"Weiter mit BELIEBIGER Taste" komme. ein Abbruch von wait findet nur mit enter/zeilenumbruch statt. Einen Abbruch mit beliebiger Taste war mir nicht möglich, da getchar immer auf enter als Eingabeende wartet. Die nicht sofort ausgelesenen Zeichen werden gepuffert...
Im Raum steht noch die Idee, system(pause) einzubauen, was allerdings unter linux wenig bringt.Bin gespannt auf weitere Ideen und vielen dank erst einmal für die überlegungen.
Wenn du tatsächlich mit "beliebiger" Taste weiter willst dann nimm das Beispiel drunter aus dem FAQ-Thread. Es sollte auf allen Win-Compilern laufen.
MfG SideWinder
-
Bashar schrieb:
Warum brauchst du das denn unbedingt? Bei Uni-Dingen steht normalerweise das Innere des Programms, die Algorithmen, das Design etc. im Vordergrund, nicht die Gestaltung der Bedienerführung. Im Standard (und damit compilerunabhängig) gibt es jedenfalls keine Möglichkeit, auf einen beliebigen Tastendruck zu warten.
ist ein Projekt, das recht viel Zeit und Anstrengung in Anspruch genommen hat. Dringend benötigt wird dieser Befehl nicht, es geht nur darum, es möglichst noch ein wenig schön zu machen. Ist so ein wenig der persönliche Ehrgeiz, der dahinter steckt. Wird nicht mal ein kleines popeliges Pünktchen geben.
SideWinder schrieb:
Wenn du tatsächlich mit "beliebiger" Taste weiter willst dann nimm das Beispiel drunter aus dem FAQ-Thread. Es sollte auf allen Win-Compilern laufen.
MfG SideWinder
Es sollte auch unter Linux kompilierbar sein.
Aber trotzdem vielen Dank euch für eure Mühen
Gruß Martin
-
Ich hab mal einen ganz anderen Ansatz dazu ...
Ich glaube, Int 16h ist ein Hardwareinterrupt, folglich auf allen x86-Systemen verfügbar, die Funktion 00h liest ein Zeichen aus dem Tastaturpuffer und wartet sonst.
Müßte folgender Code
push ax mov ah, 0 int 16h pop ax
nicht dann genau das tun was man will ? Nur wie programmier ich das für z.B. den GCC inline Assembler ? Ich kapier die Doku dazu nicht ...
-
Ein Hardwareinterrupt ist ein Interrupt, der von der Hardware ausgelöst wird, ein Softwareinterrupt ist einer, der von der Software (über den INT-Befehl) ausgelöst wird. Soviel erstmal dazu. Weiterhin ist Interrupt 16h ein BIOS-Interrupt, d.h. er ist nur im Real-Mode des (x86-)Prozessors verfügbar. Das beschränkt den Einsatz auf DOS-Programme, modernere OS' laufen im Protected Mode.
Zu guter letzt: Selbst wenn du eine hardwarenahe Möglichkeit findest, auf eine Taste zu warten, die über alle x86-Systeme portabel ist (müßte gehen, wenn du USB-Keyboards außsen vor läßt (die sind allerdings im Kommen)), würde kein modernes Betriebssystem das zulassen. Du bist immer auf die API des OS angewiesen.
-
Sorry, wegen der Begrifflichkeit.
Naja, das klappt dann ja wohl nicht.
-
Hier ein Stück man-page zu getchar. Funktioniert unter Linux wie überall sonst, es liest einen beliebigen Buchstaben von stdin
getchar(3) - Linux man page
NAME
fgetc, fgets, getc, getchar, gets, ungetc - input of characters and strings
SYNOPSIS
#include <stdio.h>int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
char *gets(char *s);
int ungetc(int c, FILE *stream);DESCRIPTION
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.
getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.getchar() is equivalent to getc(stdin).
gets() reads a line from stdin into the buffer pointed to by s until either a terminating newline or EOF, which it replaces with '\0'. No check for buffer overrun is performed (see BUGS below).
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer.
ungetc() pushes c back to stream, cast to unsigned char, where it is available for subsequent read operations. Pushed - back characters will be returned in reverse order; only one pushback is guaranteed.
Calls to the functions described here can be mixed with each other and with calls to other input functions from the stdio library for the same input stream.
For non-locking counterparts, see unlocked_stdio(3).
RETURN VALUE
fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.
gets() and fgets() return s on success, and NULL on error or when end of file occurs while no characters have been read.ungetc() returns c on success, or EOF on error.
CONFORMING TO
ANSI - C, POSIX.1
BUGS
Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.
It is not advisable to mix calls to input functions from the stdio library with low - level calls to read() for the file descriptor associated with the input stream; the results will be undefined and very probably not what you want.SEE ALSO
read(2), write(2), ferror(3), fopen(3), fread(3), fseek(3), puts(3), scanf(3), unlocked_stdio(3)Poste doch mal das Stück Code welches bei dir nicht funktioniert.
-
@PAD: Und was tun wenn im Buffer schon ein Zeichen ist? Dann wird das ausgelesen und der User kommt erst wieder nicht zur Eingabe eines beliebigen Zeichens. Vorher Puffer löschen oder das wird nichts!
BTW: Ich glaube wenn kein Zeichen im Puffer ist kann man bei getchar() trotzdem soviele Zeichen eingeben wie man will bloß wird nur eins zurückgegeben?!
MfG SideWinder
-
happyaura hatte behauptet sein getchar würde nur auf "Enter" reagieren, deswegen die manpage. Das man den stdin Buffer vorher leermachen sollte ist wohl selbstverständlich.
BTW sometimes i think something is trolling around
-
Das Problem mitgetchar ist bei mir, dass ich mehrere Zeichen einlesen kann, die dann gepuffert werden. Das Einlesen wird aber leider nur mit Enter beendet.
Ich bin auf der Suche nach einer Möglichkeit, zwischen 2 Textausgaben eine Pause zu machen, die mit beliebiger Taste beendet werden kann.
Kleines Primitives BSP:
char c,d,e; c=getchar(); printf("pause"); d=getchar(); e=getchar();
Im o.g. BSP. könnte ich "abc ENTER" eingeben, dann würde erst c den Wert 'a' bekommen, "bc Enter" würden gepuffert werden. Dann "pause" ausgegeben werden, dann d den Wert 'b' bekommen und zum Schluß e den Wert 'c'.
Es sollte aber in der gesuchten Funktion, die hier das getchar ersetzen soll, bereits nach der Eingabe von a "pause" ausgegeben werden. Ausserdem sollte sie Ansikonform sein. Ein Einlesen eines Zeichens muß nicht unbedingt stattfinden, wobei ich dafür an anderer Stelle noch Verwendung hätte.MfG Martin
-
Das geht mit Standard-ANSI-C nicht und mit Standard-ISO-C++ auch nicht. Entweder Plattformabhängig oder nicht :).
MfG SideWinder
-
Nachdem deine Platform an der Stelle probleme macht, können wir vielleicht
weiterhelfen, wenn du uns sagst mit was für einem System du arbeitest.
Vielleicht kann man ja im OS das handling von buffered of not buffered setzen.Dazu müssen wir aber das System kennen.
-
Es sollte auch unter Linux kompilierbar sein.
Bedeutet vorerst: Win+Linux.
Was willst du damit nun anfangen?
MfG SideWinder
-
Ich weiß ja nicht wie das in ANSI-C aussieht, aber kann man hier nicht irgendwie abfragen ob eine taste gedrückt wurde (das kann sogar TP)? Dann könnte man eine Endlosschleife laufen lassen und diese dann abbrechen durch einen tastendruck, wodurch das Programm beendet wäre...kp.
Code-Hacker
-
Code-Hacker schrieb:
Ich weiß ja nicht wie das in ANSI-C aussieht, aber kann man hier nicht irgendwie abfragen ob eine taste gedrückt wurde (das kann sogar TP)? Dann könnte man eine Endlosschleife laufen lassen und diese dann abbrechen durch einen tastendruck, wodurch das Programm beendet wäre...kp.
Code-Hacker
Nein kbhit() ist ebenfalls kein Standard.
MfG SideWinder
-
Ich denke, ich werd es dann wohl bei der aktuellen Fassung belassen, um es sowohl offen für Win und Linux und sämmtliche Compiler zu lassen. Gab zwar in der Richtung keinerlei Einschränkungen, aber ist mir doch lieber so.
Ich bin ja beruhigt, dass es nicht an meinen Kenntnissen lag, sondern auf die Art und Weise, wie ich es mir vorgestellt habe wirklich nicht möglich ist.Wünsch allerseits noch einen schönen Tag und Dank noch mal für Eure Ideen.
Martin
-
@SideWinder
Ich werde bei unseren Linux Spezialisten mal nachfragen ob man durch eine Systemeinstellung auch unter Linux einen unbufferd IO bekommen kann
so daß getchar funktioniert wie in der man page beschrieben