Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

30.04.2006, 01:17

[selfmade]: getch

Hi,

hab ja oft geschrieben das man 'getch' aus der Headerdatei <conio.h> nicht benutzen sollte und immer eine eigen Alternative empfohlen, da diese erstens mehr Lernpotenzial haben und zweitens man dafür keinen Zusatzheader benötigt, der sowieso nicht mal Standardisiert ist.

Für Windowscoder gibt es da eine ganz smoothe Alternative mal wieder aus den Pfoten Patricks :D Natürlich als Unicode-Variante und ausnahmsweise auch mal als Ascii-Variante.

C-/C++-Quelltext

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
#if defined (UNICODE)
wchar_t getch (void)
#else
char getch (void)
#endif
{
    ::INPUT_RECORD  record;     // Puffer für gelesene Eingabedaten

    unsigned long   event = 0;  // Anzahl gelesener Events


        // Eingabe holen

#if defined (UNICODE)
    while (::ReadConsoleInputW (::GetStdHandle (STD_INPUT_HANDLE), &record, 1, &event))
#else
    while (::ReadConsoleInputA (::GetStdHandle (STD_INPUT_HANDLE), &record, 1, &event))
#endif
    {
            // Wenn es beim Start noch keinen gelesenen Event gab, dann gab es einen Lesefehler!

        if (event == 0) break;

            // Es muss sich um einen Tastaturevent handeln und eine Taste muß gedrückt worden sein.

        if (record.EventType == KEY_EVENT && !record.Event.KeyEvent.bKeyDown) break;
    }

        // Zeichen zurückgeben.

#if defined (UNICODE)
    return (record.Event.KeyEvent.uChar.UnicodeChar);
#else
    return (record.Event.KeyEvent.uChar.AsciiChar);
#endif
}


Man benötigt nur die <windows.h> und schwupps ist die Sache gegessen. Funktionalität ist fast äquivalent zur 'getch' aus der <conio.h> nur mit dem Unterschied das bei Unicode das Zeichen als wchar_t zurück gegeben wird (und nicht als int) und bei der Ascii-Variante ebenfalls das Zeichen zurück gegeben wird, jedoch als char und nicht mehr als int. Wenn man einen int haben möchte, kann man den Rückgabewert casten zu einem int, long oder sonst was. Dann ist das Ergebnis das selbe wie aus der Orginalen 'getch'.

In Performancetests hat die Funktion erheblich besser abgeschnitten als die 'getch' von <conio.h>, da diese weniger Belastung mit sich führt und das Programm schön klein hält, da es keine Zusatzlib benötigt. Ebenfalls ergibt sich ein für Windowsplattformen portabler Code, da nur noch der standardisierte Windowsheader benutzt wird und nicht mehr die <conio.h>, die nicht Standardisiert ist.

Viel Spaß damit, Feedback und Fragen sind erwünscht! Bis zum nächsten Mal!

- Patrick

edit: und natürlich bugfrei und qualitativ Hochwertig ;)

edit 2:
Infos zu den benutzen Funktionen gibt es hier:
ReadConsoleInput : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/readconsoleinput.asp
INPUT_RECORD: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/input_record_str.asp
GetStdHandle: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getstdhandle.asp

Lesenswert, damit man auch genau weiß, was der Code macht. ;)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

30.04.2006, 01:33

Ich glaub, die übernehm ich ohne Änderung :P

Könnte mich glatt von der conio.h kurieren.

Anonymous

unregistriert

3

30.04.2006, 10:09

Kleines Update.

Sheddex

unregistriert

4

30.04.2006, 10:15

Ihr müsste mich jetzt nicht schlagen ;) :

Braucht man getch () eigentlich für Grafikprogrammierung? Eigentlich doch nur für Konsole oder? In Grafikprogrammen hat man ja DirectInput und GetAsyncKeyState...

Anonymous

unregistriert

5

30.04.2006, 10:42

Hauptsächlich Console. Realtime-Anwendungen eher gar nicht, da das Programm solange in seinem eigenen Task gefange ist und blockiert, bis die Funktion beendet wurde.

Für Grafikprogrammierung und Realtimeanwendung benutzt man meistens Fensternachrichten oder DirectInput für diverse Features.

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

6

30.04.2006, 11:46

thx für die Funktion,
kann man sicher recht gut gebrauchen :)

Anonymous

unregistriert

7

30.04.2006, 15:48

Gibt es sonst noch Funktionen von denen ihr wissen wollt wie man sie selfmade macht, um zu verstehen wie diese Funktionieren? :)

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

8

30.04.2006, 15:50

pD3DDevice->DrawPrimitiveUP?? ;) :D
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

9

30.04.2006, 16:01

Black-Panther
Gib mir 12h. Sie wird genau so Funktioniern nur etwas viel schneller. ;) Aber ich glaub das war eher ein Scherz ;)

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

10

30.04.2006, 16:46

Jo... wars... ;)
Aber würdest du das WIRCKLICH schaffen?
Wenn ja, mich würde mal grundsätzlich (nur grob) interessieren wie sie funktioniert!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige