Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

[C++] Compiliert sich aber einlesen von Tasten funct net

Hi,

alsoo bei diesem quellcode:

        OMITEM(0,0); //POSITION 0 -> POS1 -> POSe -> HMPOS0
       
        OPOS0:
        TST = getch();
        if ((TST==224) || (TST==0))
        {
        TST = getch();
        switch(TST)
        {
                   case 80: //Pfeil nach unten
                        OMITEM(1,0);
                        goto OPOS1;
                        break;
                   case 13:  //Enter taste
                        OMITEM(0,1);
                        goto OPOS0;
                        break;
                   case 114: //R Taste
                        goto POS0;
                        break;
                   default: //default
                        OMITEM(0,0);
                        goto OPOS0;
                        break;
        }
        }
        OPOS1: //POSITION 1 -> POS0 -> POS2 -> POS1e -> HMPOS0
        TST = getch();
        if ((TST==224) || (TST==0))
        {
        TST = getch();
        switch(TST)
        {
                   case 72: //Pfeil nach oben
                        OMITEM(0,0);
                        goto OPOS0;
                        break;
                   case 80:
                        OMITEM(2,0);
                        goto OPOS2;
                        break;
                   case 13:
                        OMITEM(1,1);
                        goto OPOS1;
                        break;
                   case 114:
                        goto POS0;
                        break;
                   default:
                        OMITEM(1,0);
                        goto POS1;
                        break;
        }
        }
        OPOS2:
        TST = getch();
        if ((TST==224) || (TST==0))
        {
        TST = getch();
        switch(TST)
        {
                case 72:
                     OMITEM(1,0);
                     goto OPOS1;
                     break;
                case 80:
                     OMITEM(3,0);
                     goto OPOS3;
                     break;
                case 13:
                     OMITEM(2,1);
                     goto OPOS2;
                     break;
                case 114:
                     goto POS0;
                     break;
                default:
                     OMITEM(2,0);
                     goto OPOS2;
                     break;
        }
        }
        OPOS3:
        TST = getch();
        if ((TST==224) || (TST==0))
        {
        TST = getch();
        switch(TST)
        {
                case 72:
                     OMITEM(2,0);
                     goto OPOS2;
                     break;
                case 13:
                     OMITEM(3,1);
                     goto OPOS3;
                     break;
                case 114:
                     goto POS0;
                     break;
                default:
                     OMITEM(3,0);
                     goto OPOS3;
                     break;
        }
        }
und jetzt klappt das nicht beim ersten einlesen der taste. Erst muss ich 'O' und dann Enter drücken... aber nürgenswo sehe ich das da irgendwo 'cin >> TST;'ist.
auch in den funktionen nicht:
void OMITEM(int pos, int act)
{
     if(pos == 0 && act == 0)
     {
       system("cls");
       DAT1(NO_ACTIVE);
       DAT2(NO_ACTIVE);
       DAT3(NO_ACTIVE);
       DAT4(NO_ACTIVE);
       DAT5(NO_ACTIVE);
       DAT6(E_ACTIVE);
       color(weiss, blau);
       PANEL();
       cout <<endl;
       color(weiss, blaugruen);
       OPTWND();
       cout << BANN::SEN;
       CWI(1);
       SCXI(0);
       ZDXI(0);
       STCRL(0);
       color(weiss, blaugruen);
       cout <<endl;
       OPTPAN();
       cout <<endl;
       CLSWND();
//weiter  code
woran kann das liegen ?
auch vorher ist nirgendwso ein fehler zu entdecken !
int main()
{
    system("color 9F");
    unsigned char TST = _kbhit();
    begin:
    _NXT_(0,0);
    POS0:  //POSITION 0
    //from pos0 to: pos1, pos5, pos0o
    color(blau,blau);
    cin >> TST; //input
    _NXT_(0,0);
    if(TST == 'a' || TST == 'A')
    {
        _NXT_(5,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(4,0); goto POS4;}
        else if(TST == 'o' || TST == 'O'){_NXT_(5,1); OMITEM(0,0); goto POS5;}
        else if(TST == 'd' || TST == 'D'){_NXT_(0,0); goto POS0;}
    }
    else if(TST == 'o' || TST == 'O')
    {
        _NXT_(0,1); goto POS0;
    }
    else if(TST == 'd' || TST == 'D')
    {
        _NXT_(1,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(0,0); goto POS0;}
        else if(TST == 'o' || TST == 'O'){_NXT_(1,1); goto POS1;}
        else if(TST == 'd' || TST == 'D'){_NXT_(2,0); goto POS2;}
    }
    POS1:
    cin >> TST; //input
    if(TST == 'a' || TST == 'A')
    {
        _NXT_(0,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(5,0); goto POS4;}
        else if(TST == 'o' || TST == 'O'){_NXT_(0,1); goto POS0;}
        else if(TST == 'd' || TST == 'D'){_NXT_(2,0); goto POS2;}
    }
    else if(TST == 'o' || TST == 'O')
    {
        _NXT_(1,1); goto POS1;
    }
    else if(TST == 'd' || TST == 'D')
    {
        _NXT_(2,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(1,0); goto POS1;}
        else if(TST == 'o' || TST == 'O'){_NXT_(2,1); goto POS2;}
        else if(TST == 'd' || TST == 'D'){_NXT_(3,0); goto POS3;}
    }
    POS2:
    cin >> TST; //input
    if(TST == 'a' || TST == 'A')
    {
        _NXT_(1,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(0,0); goto POS0;}
        else if(TST == 'o' || TST == 'O'){_NXT_(1,1); goto POS1;}
        else if(TST == 'd' || TST == 'D'){_NXT_(3,0); goto POS3;}
    }
    else if(TST == 'o' || TST == 'O')
    {
        _NXT_(2,1); goto POS2;
    }
    else if(TST == 'd' || TST == 'D')
    {
        _NXT_(3,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(2,0); goto POS2;}
        else if(TST == 'o' || TST == 'O'){_NXT_(3,1); goto POS3;}
        else if(TST == 'd' || TST == 'D'){_NXT_(4,0); goto POS4;}
    }
    POS3:
    cin >> TST; //input
    if(TST == 'a' || TST == 'A')
    {
        _NXT_(2,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(1,0); goto POS1;}
        else if(TST == 'o' || TST == 'O'){_NXT_(2,1); goto POS2;}
        else if(TST == 'd' || TST == 'D'){_NXT_(3,0); goto POS3;}
    }
    else if(TST == 'o' || TST == 'O')
    {
        _NXT_(3,1); goto POS3;
    }
    else if(TST == 'd' || TST == 'D')
    {
        _NXT_(4,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(3,0); goto POS3;}
        else if(TST == 'o' || TST == 'O'){_NXT_(4,1); goto POS4;}
        else if(TST == 'd' || TST == 'D'){_NXT_(5,0); goto POS5;}
    }
    POS4:
    cin >> TST; //input
    if(TST == 'a' || TST == 'A')
    {
        _NXT_(3,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(2,0); goto POS2;}
        else if(TST == 'o' || TST == 'O'){_NXT_(3,1); goto POS3;}
        else if(TST == 'd' || TST == 'D'){_NXT_(4,0); goto POS4;}
    }
    else if(TST == 'o' || TST == 'O')
    {
        _NXT_(4,1); goto POS4;
    }
    else if(TST == 'd' || TST == 'D')
    {
        _NXT_(5,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(4,0); goto POS4;}
        else if(TST == 'o' || TST == 'O'){_NXT_(5,1); OMITEM(0,0); goto POS5;}
        else if(TST == 'd' || TST == 'D'){_NXT_(0,0); goto POS0;}
    }
    POS5:
    cin >> TST; //input
    if(TST == 'a' || TST == 'A')
    {
        _NXT_(4,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(3,0); goto POS3;}
        else if(TST == 'o' || TST == 'O'){_NXT_(4,1); goto POS4;}
        else if(TST == 'd' || TST == 'D'){_NXT_(5,0); goto POS5;}
    }
    else if(TST == 'o' || TST == 'O')
    {
//
//
//hier ist der teil mit dem einlesen der Tasten !!!!
//
//
    else if(TST == 'd' || TST == 'D')
    {
        _NXT_(0,0);
        cin >> TST;
        if(TST == 'a' || TST == 'A'){_NXT_(5,0); goto POS5;}
        else if(TST == 'o' || TST == 'O'){_NXT_(0,1); goto POS0;}
        else if(TST == 'd' || TST == 'D'){_NXT_(1,0); goto POS1;}
    }
    goto begin;
    return 0;
}
alsoo...

Ich hoffe jemand hat lust den quellcode zu durchsuchen... ;D ich habs schon mehr mals versucht ;D

Danke im Vorraus

MFG
TOMEK

Antworten zu [C++] Compiliert sich aber einlesen von Tasten funct net:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Da sonst niemand was schreibt, schreib ich mal einfach was, auch wenn ich eh kein C-Gosu bin.

Also ich hab ewig kein C mehr programmiert, dein Quelltext verwirrt mich jedenfalls sehr... vor allem hab ich noch nie nen Quelltext mit Goto-Befehlen in ner höheren Programmiersprache gesehen.

Du führst ja 2 mal getch() aus... einmal anscheinend um das Null-Byte abzufangen (224 kenne ich nicht).
Wenn das kommt, musst du ja ein weiteres mal getch() machen, da die Tastatur ja ein 2-Byte-Zeichen gesendet hat.

Nun verstehe ich z.B. folgende Behauptung im Kommentar nicht:
case 114: //R Taste

Das ist doch ein Nullbyte, gefolgt vom Byte 114. Die R-Taste ist aber lediglich das Byte 114, ohne vorheriges Nullbyte.

Bei der R-Taste würde ja z.B. die erste Bedingung
if ((TST==224) || (TST==0))
nicht zutreffen und er geht einfach zur mit OPOS1: gekennzeichneten Zeile weiter.

Wäre vielleicht sinnvoll, wenn du genauer erklärst, was das Programm machen soll und du das Problem genauer schilderst, ich kapier nämlich weder Programm, noch Problem.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

aha... dass hab ich erst jez bemerkt das 114 (R) kein Nullbyte als erstes ausgibt.... aha ok...

Wäre vielleicht sinnvoll, wenn du genauer erklärst, was das Programm machen soll und du das Problem genauer schilderst, ich kapier nämlich weder Programm, noch Problem.

Alsoo... das programm soll ein menü haben dass mit pfeiltasten gesteuert wird (z.B. siehe die menüs vom BIOS). Das problem ist jez: Wenn ich im Menü unter Optn(Optionen) gehe:

Aber hier damit überhaupt eine taste gelesen wird muss ich erst "o" schreiben und mit enter bestätigen... aber wieso ?
Denn das war nich geplant ;D

MFG
TOMEK
« Letzte Änderung: 05.01.07, 22:05:08 von Sniper-Hawk »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ist es denn überhaupt richtig, dass du mit cin arbeitest?

Wenn du versuchst mit
cin >> TST;
ein einzelnes Zeichen einzulesen, dann ließt er das ja erst ein, sobald du einmal Return gedrückt hast. Bei allen nachfolgenden
cin >> TST;
ließt er dann erst überflüssige Zeichen aus dem Puffer (wenn dieser zuvor nicht explizit gelöscht wurde), nur wenn nichts mehr im Puffer ist, verlangt er wieder die Eingabe mindestens eines Zeichens mit anschließendem Return.
getch() und cin könnten sich auch wegen dem Puffern in die Quere kommen.

Irgendwie finde ich den Programm-Code etwas falsch designed. Kannst du den nicht so umschreiben, dass kein Goto mehr vorkommt und der Aufruf von getch() an möglichst wenig Stellen erfolgt?

Und cin würde ich dann komplett rausschmeißen...
oder, falls die Klasse von cin irgend eine entsprechende Methode bietet, machst du einfach alles mit cin, schmeißt dafür alle getch() raus.

« Letzte Änderung: 06.01.07, 14:40:13 von mati »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Alsoo ich habs jetzt kapiert...

Alsoo das mit dem goto... das wollte ich eigentlich auch nicht. Aber sonst müsste ich ja unendlich langen code schreiben...

Das mit dem Pufferlehren geht !

FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));

und das mit den "cin" wird es so oder so garnicht mehr geben...

alsoo danke. jez funct alles so wie es soll !!
THX !

MFFG
TOMEK

Hi Tomek!

Also ich spiele auf seit geraumer zeit mit c++ ein bisschen rum.

Erst mal, was ich loswerden muss:
KEINE GOTOS -> ABSOLUTES VERBOT!

Also dein Ansatz stimmt schon mal.
Nur das mit dem 0Byte bei der Eingabe musst du noch etwas überdenken.

getch() gibt dir den Char wert des gedrückten Zeichen zurück. Sollte der Wert 224 haben wurde eine Spezialtaste (Pfeiltaste, Bild auf/ab, ...) gedrückt.
Ist der Rückgabewert nicht 224 dann bekommst du sofort das CHAR bzw. seinen ASCII Wert z.B. wenn du ein "A" drückst bekommst du 65 oder 'A'.

Wo dein Problem leigen könnte, ist bei der Deklaration von deinem TST, um Fehler, vor allem beim Abfragen der spezialtasten zu vermeiden solltes du es als "unsigned int" deklarieren.


hier mal ein kleines Beispiel:

unsigned int ch;
ch = getch()

if(ch == 224)
{
        unsigned int ch2 = getch();
        //DOWN
        if(ch2 == 72)
        {

        }
       
        //UP
        else if(ch2 == 80)
        {

        }
}
//ENTER = char 13
else if(ch == 13)
{

}
//es geht auch so
else if(ch == (int)'x')
{

}

Zum testen würd ich mir am besten ein miniprogramm schreiben:
void main()
{
   cout<<(int)getch()<<endl;
   cout<<(int)getch();
}

Damit siehst du immer welche Werte die Tasten haben.

MFG
BWA
« Letzte Änderung: 07.01.07, 17:05:45 von BWA »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

JO danke man ! Werd dass gleich ausprobieren !

Ich hoffe ma dat klappt !

THX !!'

MFG
TOMEK


« Borland C++ Builder & ADOAutostart »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...

QR-Code
QR-Codes, die Abkürzung für "Quick Response Codes", sind eine Form von zweidimensionalen Barcodes. Damit lassen sich Informationen schnell und effizient speiche...