tastenzeichen zu jedem zeitpunkt abfragen
-
bis jetzt habe ich es per getch gemacht und dann if = 27
ich möchte aber das man esc drücken kann an jedem punkt des programmes ohne an einer bestimmen stelle sein zu müssen. bei esc soll er dann in eine bestimmte funktion gehen
wie geht das und wenn bitte ein beispiel in c wie man es schreiben würde.
danke oliver
-
gib mal etwas code von deinem Programm.
So nach der Beschreibung kann ich mir nicht so viel vorstellen.
Möglicherweise könnte "kbhit()" dir helfen.gruss, flyingCoder
-
im mom frage ich ne eingabe ab z.b. wie ist dein name danach cin. ich möchte aber das er aus der function zu jederzeit per esc rauskann
ich will das if ganz herausnehmen
nur wie benutze ich genau kbhit() unter help habe ich zwar ne erklärung, aber die sagt mir null, wo setze ich kbhit() ein damit im ganzen programm nutzen kann, egal in welcher function oder sonst was ist?
-
Nein kbhit() bringt dir in diesem Fall gar nichts.
Wenn du immer und überall mit Escape das Programm beenden willst wirst du um eine eigene Eingabefunktion nicht herumkommen, hier ein erster Ansatz in C:
void readline (char* Buffer, unsigned long int Size) { if(!Buffer) return; unsigned long int i; char c = ' '; for(i = 0; i < Size - 1; ++i) { c = getch(); if(c == 27) exit(0); else Buffer[i] = c; } Buffer[i] = 0; }
Irgendetwas in diese Richtung.
MfG SideWinder
-
0liver schrieb:
nur wie benutze ich genau kbhit()
du wirst lachen, aber ich hatte vor einiger Zeit auch mal dieses Problem. Mit "kbhit()" kannst du feststellen, ob eine Taste gedrückt gedrückt wurde oder nicht. Hier ein (nicht gerade sinnvolles Beispiel) zu "kbhit()":
#include <stdio.h> #include <conio.h> int main () { int c; for (;;) { if (kbhit()) { c = getch(); break; } } putchar (c); return 0; }
Wenn du mit "kbhit() gleich war" festgestellt hast, dass eine Taste gedrückt wurde, kannst du sie mit "getch()" abfangen.
Gruss, flyingCoder.
-
Oh, da bin ich genau eine Minute zu spät gekommen
(Und habe SideWinder garnicht bemerkt ...)
Nein kbhit() bringt dir in diesem Fall gar nichts.
Hast recht - war ein erster Ansatz und ich hatte nicht drüber nachgedacht ...
-
also ich habe das
cout << "Name: ";
cin >> name;
cout << "Name erfolgreich eingegeben!";so nun möchte ich das der user zwischen cout und cin ohne etwas daovn bemerken zu müssen durch z.b. ne zusätzliche taste um cin zu bekommen, weil er ja kein esc drück, dass er esc drücken kann, wenn er es nicht drückt und mit bustaben anfängt als oliver schreib, dass es ins cin kommt. mein code ist bis jetzt so
void user_add()
{
x=useradd_z
cout << "Bitte geben Sie den Usernamen an: ";
int tast=getch();
if(tast!=27)
{
cin << lottouser[x];
useradd_z=useradd_z+1;
useradd();
}
else
{
start();
}das geht net, kann mir wer sagen wie ich das nun genau einbinde was ihr mir da sagtest
wobei verstanden habe ich die logig von sidewinder, nu wie baue ich es nu genau ein?
mache mal bitt enen beispiel so das zwischen cout und cin die möglichkeit besteht statt nen namen einzugeben auch esc zu drücken
-
Okay du arbeitest mit C++, sollst du deine Lösung bekommen:
#include <iostream> #include <conio.h> using namespace std; void readline (char* Buffer, unsigned long int Size, char ProgramTermination = 27) { // Ist Buffer kein Zeiger auf ein Array oder die Größe von Buffer 0 -> return if(!Buffer || Size == 0) return; // Zeichen einlesen - bei ProgramTermination-Zeichen (STD: Escape) -> program termintaion char c = getch(); if(c == ProgramTermination) exit(0); // Buffer einlesen Buffer[0] = c; for(unsigned long int i = 1; i < Size; ++i) Buffer[i] = getch(); Buffer[i] = 0; // ZeroTerminated String } int main () { char name [128]; cout << "Name: " << flush; cin >> name; return(0); }
Sollte eigentlich funktionieren - wenn nicht Fehler posten
MfG SideWinder
-
Fehler:noname01.cpp(3,16):Namespace name expected
Warn :noname01.cpp(12,22):Conversion may lose significant digits
Fehler:noname01.cpp(14,14):Call to undefined function 'exit'
Warn :noname01.cpp(19,21):Conversion may lose significant digits
Fehler:noname01.cpp(21,14):Undefined symbol 'i'zwischen frage was bedeutet die erste zeile?
danke fürs beispiel, es gibt selten menschen die so hilfsbereit sind. meine hochachtung!
-
Die zwei Warnungen kannst du ignorieren - ist bloß weil getch() einen int zurückgibt, aber das ist nebensächlich.
Fehler 3: Uh für exit() brauch ich eine weitere Headerdatei, oben noch ein "#include <cstdlib>" dazu.
Fehler 5: Oha, du benützt einen standardkonformen Compiler und ich alter MSVC-User hab das übersehen. Na gut, also statt "unsigned long int i" in der for-Schleife zu definieren ziehst du es raus:
unsigned long int i; for(i=0;
Der Rest wie gehabt.
Fehler 1: Hmm, den hingegen kapier ich nicht. Kann es sein, dass deine Header-Dateien veraltet sind bzw. dein Compiler schon etwas älter ist? Egal entferne die Zeile "using namespace std;" einfach mal und schau obs dann geht - wenn das der Fall ist würde ich zudem noch den Compiler updaten.
MfG SideWinder
-
Also, wenn man jederzeit im Programm mit ESC das Programm beenden soll, dann fällt mir da eher ein Thread ein. Allerdings wäre von dieser Lösung abzuraten.
Eine eigene Eingabefunktion wäre schon besser.
@SideWinder
Deine Funktion ist aber noch nicht ganz fertig, oder?? Aja und wo wird sie aufgerufen bei deinem Beispiel?Eine andere Lösung wäre noch eine Funktion zu schreiben, die alleine das Abfangen des ESC erledigt und bei einem anderen Zeichen normal weitermacht:
... #define ESC 27 ... void chkesc(void) { int zeichen; while(!kbhit()) //Warten bis ein Zeichen eingegeben wurde { //Hier könnten auch noch andere Sachen erledigt werden Sleep(1); //Wir wollen ja die anderen Prozesse nicht blockieren ;) } zeichen = getch(); //Zeichen holen if(zeichen == ESC) //auf ESC prüfen { exit(1); //Abbruch durch Benutzer } ungetch(zeichen); //geholtes Zeichen wieder in den Eingabepuffer schieben } ... //Beispiel cout << "Name: "; chkesc(); cin >> name; ...
[Edit]Beispiel vergessen[/Edit]
-
Okay natürlich sieht der Hauptprogrammaufruf anders aus
Statt "cin >> name" kommt da natürlich "readline(name,128)" hin.
@AJ: Hmm ja sieht auch gut aus - aber für reines Stringeinlesen spart man sich bei mir halt einen Funktionsaufruf der den Code mehr und mehr verunstaltet.
BTW: Wenn man ein Programm immer (auch in jeder Schleife) mit Escape abbrechen will bringt ein Thread auch nichts, da dieser keine Tastatureingaben erhält
MfG SideWinder
-
SideWinder schrieb:
@AJ: Hmm ja sieht auch gut aus - aber für reines Stringeinlesen spart man sich bei mir halt einen Funktionsaufruf der den Code mehr und mehr verunstaltet.
Das schon, aber ich hab auch gleich dran gedacht, dass der Anwender dann vielleicht auch mal Zahlen eingeben soll
SideWinder schrieb:
BTW: Wenn man ein Programm immer (auch in jeder Schleife) mit Escape abbrechen will bringt ein Thread auch nichts, da dieser keine Tastatureingaben erhält
Bist du dir da sicher?? Ich habs zwar noch nicht ausprobiert, aber ich bezweifle, dass es nicht gehen sollte. Schließlich schauen die Eingabefunktionen ja nur auf dem Eingabepuffer nach, ob was drinsteht und warum sollte auf diesen von einem Thread aus nicht zugegriffen werden können?