Probleme mit switch-case
-
Guten Morgen.
Ich hab da ein Probleme mit einer switch-case anweisung bzw wie ich die aufstellen könnte.Es geht um die auswertung von Tasten-Eingaben.
definiert sind u.a. die tasten a-z mit#define KEY_A 0 #define KEY_B 1 ... #define KEY_Z 26 ... #define MAX_KEY 35in meinem Input Handler werden die mit nem bool-array ausgewertet so das ich letztendlich nur noch mit einem
if(IHandler.bKeys[KEY_A])teste, ob (in dem fall) A gedrückt wurde.
nun wollte ich das ganze in eine switch-case anweisung packen.
ist das in diesem fall so einfach möglich? ist ja nun ne abfrage,1. welche taste gedrückt wurd
2. ob sie true ist
-
Eroda schrieb:
1. welche taste gedrückt wurd
2. ob sie true istGibt es auch den zustand dass eine Taste gedrückt und false ist?

-
ne.
wenn sie gedrückt wird, ist sie true und wird die taste losgelassen ist sie falseich hab das eher so gemeint das ich ja checken muss, welche teste ist gedrückt
(KEY_A, KEY_B, KEY_C, ...)
und dann ob sie true/false ist.aber ich glaub das das mit ner for-schleife dann doch besser wäre zu realisieren
-
Welche Fkt nutzt du denn?
WinAPI?
Falls ja sind die defines unnötig bzw falsch:
KEY_A ist 'A'
KEY_B ist 'B'
etc
'0' ... '9' ist auch '0' ... '9' - nur für das num-pad gibts dann noch VK_NUM_0 ... _9 oder so was in der richtung
dann gibts noch VK_RETURN, ... und so weiter...und wie speicherst du, welche taste gedrückt ist? wenns ne map ist, würdest du dir relativ viel arbeit ersparen können^^ hast aber "nur" noch O(log(n)) und nicht mehr O(1) wie du es in nem c-array haben könntest...
mit ner for-schleife geht das leider nicht ganz standard-konform, da nur 'A' < 'Z' gegeben ist, aber nicht, dass 'A'...'Z' direkt aufeinander folgen.
das kannst du entweder über nen c-array auf dem stack und mittels for lösen (das sollte der compiler wegoptimieren können) oder dich darauf verlassen, dass dein code niemals auf komische plattformen portiert werden soll oder wirklich nur mit nem großen switch (in der for-schleife)...
da weiß ich nicht, in wie fern der compiler so etwas vll auch weg-optimieren kann...bb
-
naja, habs nu etwas anders gemacht, mit
std::string OneChar; char cChar[]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; for(int i=0; i<26; i++) { if(IHandler.bKeys[i]==true) { OneChar=cChar[i]; IHandler.bKeys[i]=false; break; } } cCon.AddCharToLine(OneChar);was auch recht gut funktioniert

-
if(IHandler.bKeys[i]==true)Das ist wohl etwas doppelt gemoppelt. Eine Bedingung auf true zu prüfen ist nicht nötig, dass macht der Compiler schon von ganz alleine

Gruß