mikrocontroller.net

Forum: PC-Programmierung _getch() Problem cpp


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Herbert P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich steh grad auf dem Schlauch. sieht jemand warum folgender Code nicht 
funktioniert? Es wird beim Drücken von "1" zwar 1 ausgegeben, aber die 
Schleife wird nicht verlassen
while (key!=1) {
  int key = _getch();
  key = key - 48;
  cout << key;
}
cout << endl << "Key 1 detected" << endl;

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil die variable key innerhalb der while Schleife deklariert wird.

Wahrscheinlich ist das nicht der ganze Code und die variable wird 
außerhalb auch deklariert. Diese variable wird für die Überprüfung bei 
while(...) Genutzt.

Autor: Zombie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast (vermutlich) zwei unterschiedliche/unabängige Variablen mit dem 
selben Namen "key", ansonsten würde dein Beispiel gar nicht kompilieren.
int key = 0;
while (key!=1) {
  key = _getch();
  key = key - 48;
  cout << key;
}
cout << endl << "Key 1 detected" << endl;

Autor: Herbert P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zombie schrieb:
> int key = 0;
> while (key!=1) {
>   key = _getch();
>   key = key - 48;
>   cout << key;
> }
> cout << endl << "Key 1 detected" << endl;

ich hatte es anfangs genau so, hier werden aber merkwürdigerweise 
Buchstaben als Buchstaben wiedergegeben anstatt deren ASCII Wert...
Wie auch immer, auch so funktionierte die Erkennung der 1 nicht.

Autor: M.K. B. (mkbit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was gibt denn das Programm im letzten Post genau aus?

Autor: Herbert P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M.K. B. schrieb:
> Was gibt denn das Programm im letzten Post genau aus?

Eingabe:
qwert12345qwert

Ausgabe (Leerzeichen zur besseren Übersicht):
65 71 53 66 68 1 2 3 4 5 q w e r t

Autor: zitter_ned_aso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum nicht einfach:
cin>>key;

Autor: Herbert P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zitter_ned_aso schrieb:
> warum nicht einfach:cin>>key;

weil ich einen einzelnen keystroke registrieren möchte und keine Eingabe 
die mit Enter terminiert werden muss.

Autor: M.K. B. (mkbit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cout gibt Zahlen als lesbare Zahlen aus. Nur bei char Datentyp (je nach 
System ist auch ein int8 ein char) werden diese als Buchstaben 
interpretiert.

Bei mir sieht die Ausgabe am Anfang auch so aus, aber die 1 wird richtig 
erkannt.

Welchen Compiler verwendest du denn. Bei mir ist _getch nicht verfügbar.

Autor: Herbert P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M.K. B. schrieb:
> Welchen Compiler verwendest du denn. Bei mir ist _getch nicht verfügbar.

Viusal Studio 2019
#include <conio.h>

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M.K. B. schrieb:
> Bei mir ist _getch nicht verfügbar.

Das ist teil von Microsofts Inkompatibilitätsprogramm. Das C standard 
equivalent ist getchar() und fgetc(stdin). Aber in C++ nimmt man ja 
normalerweise sowieso std::cin.

Autor: Zombie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herbert P. schrieb:
> Eingabe:
> qwert12345qwert
>
> Ausgabe (Leerzeichen zur besseren Übersicht):
> 65 71 53 66 68 1 2 3 4 5 q w e r t

Sorry, aber das kann doch nicht sein. Die ersten zehn Eingaben werden 
richtig verarbeitet, und die nächsten fünf nicht mehr?!

Zeig mal den ganzen Code.

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So nebenbei 1 != '1'.

Autor: M.K. B. (mkbit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DPA schrieb:
> So nebenbei 1 != '1'.

Ja, aber nachdem ja erst 48 abgezogen werden, passt es.

Autor: Zombie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DPA schrieb:
> So nebenbei 1 != '1'.

deswegen schreibt er ja auch
key = key - 48;

wobei ich eher
key = key - '0';

schreiben würde.

Autor: zitter_ned_aso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und davor noch
if(isdigit(key))
...

Aber das wird immer mehr C statt C++.

Autor: Herbert P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zombie schrieb:
> Zeig mal den ganzen Code.


Danke für den Tipp! Ich wollte den Code nun abgrenzen (der gesamte COde 
ist zeimlich lang). Dabei bin ich auf folgendes gestoßen:

Unmittelbar nach der while Schleife hatte ich:
  cin >> n;

mit dem ich zuvor mal getstet hatte. Steht das dort, wird die SChleife 
nicht verlassen. Sehe zwar den Grund dafür nicht, aber zumindest konnte 
ich die Fehlerquelle eleminieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.