immerwieder diese Pfeiltasten



  • SideWinder schrieb:

    CStoll (off) schrieb:

    Mir fällt auf Anhieb keine ein. Du könntest höchstens die ganze Bildschirmmaske in ein string-Array schreiben und nach jedem Tastendruck aktualisieren und neu ausgeben.

    Nix gut. Erstens performancemäßig im Keller und zweitens kennst du die Größe des Bildschirmpuffers nicht, das heißt dein Array könnte zu klein sein und du hast ekelhafte Bildbrüche.

    Erstens ist mir klar, aber er hat ja nicht nach einer performanten Alternative gefragt 😉 und zweitens könnte man notfalls umgehen, indem man dynamische Arrays (vector<string>) verwendet.

    Aber soviel ist klar: Wenn man versucht, eine Bibliotheksfunktion "nachzubauen", hängt man beinahe immer hinter dem Original hinterher.



  • hmpf geht nit -.-



  • Zwischenfrage: was heißt "geht nit" genau?



  • hab das umgeschrieben aber geht nix 20 fehler -.- un auch linker fehler ^^



  • Wie sieht das Programm denn aus - und was für Fehler kommen dabei?
    (meist sind die Meldungen des Compilers recht aufschlußreich, auch wenn die Ursache mitunter etwas oberhalb der Fehlerstelle liegt)



  • hab ne andere Idee

    #include "iostream"
    #include "windows.h"
    #include "conio.h"
    
    using namespace std;
    
    int xpos(int p)
    {return 33;}
    int ypos(int p)
    {return 8+7*p;}
    
    void gotoxy(short x, short y)
    {
        HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD position = { x , y };
    
        SetConsoleCursorPosition(hStdout, position);
    }
    int main()
    {
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	CONSOLE_CURSOR_INFO CCI;
    	GetConsoleCursorInfo(hOut, &CCI);
    	CCI.bVisible = false;
    	SetConsoleCursorInfo(hOut, &CCI);
    
    	int x=33;
    	int pos=0;
    	char taste;
    	int y=8;
    	char a=205,b=201,c=187,d=186,e=200,f=188,g=205,h=209,k=62;
    	int befehlszahl=2;
    	int p=0;
    
    	gotoxy(27, 6); cout <<"                        "<<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl;
    	gotoxy(27, 7); cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 8); cout <<"                        "<<d<<"    TEST    "<<d<<endl;
    	gotoxy(27, 9); cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 10);cout <<"                        "<<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl;
    	gotoxy(27, 11);cout <<""<<endl;
    	gotoxy(27, 12);cout <<""<<endl;
    	gotoxy(27, 13);cout <<"                        "<<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl;
    	gotoxy(27, 14);cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 15);cout <<"                        "<<d<<"    TEST    "<<d<<endl;
    	gotoxy(27, 16);cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 17);cout <<"                        "<<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl;
    
    	gotoxy(x,y);
    	char ch=0;
    	while (ch!='\n')
        {      
            ch=0;
            if (kbhit()) ch=getch ();
            {
                if (ch==72)
    			{
        gotoxy(xpos(pos),ypos(pos));cout<<"   ";
        pos=(pos-1)%befehlszahl;
        gotoxy(xpos(pos),ypos(pos));cout<<"==>";
    			}
    		if (ch==80)
    		{
        gotoxy(xpos(pos),ypos(pos));cout<<"   ";
        pos=(pos+1)%befehlszahl;
        gotoxy(xpos(pos),ypos(pos));cout<<"==>";
    		}
    		}
    
    gotoxy(1,1);
    switch(pos)
    {
    case 0:cout<<"oberster Befehl";break;
    case 1:cout<<"zweiter Befehl";break; 
    }
    	}
    }
    

    kann ich nicht für das Switch(pos)
    ne if machen mit ENTER Taste?
    also if (pos=1) und dann mit kbhit halt für enter taste zum bestätigen?



  • wenn du aus der Schleife raus bist, war ENTER die letzte Taste, also brauchst du das nicht mehr zu kontrollieren. Und in pos steht die Nummer des zuletzt gewählten Menüpunktes - wie du die auswertest, ist deine Angelegenheit.



  • #include "iostream"
    #include "windows.h"
    #include "conio.h"
    
    using namespace std;
    
    int xpos(int p)
    {return 33;}
    int ypos(int p)
    {return 8+7*p;}
    
    void gotoxy(short x, short y)
    {
        HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD position = { x , y };
    
        SetConsoleCursorPosition(hStdout, position);
    }
    int main()
    {
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	CONSOLE_CURSOR_INFO CCI;
    	GetConsoleCursorInfo(hOut, &CCI);
    	CCI.bVisible = false;
    	SetConsoleCursorInfo(hOut, &CCI);
    
    	int x=33;
    	int pos=0;
    	char taste;
    	int y=8;
    	char a=205,b=201,c=187,d=186,e=200,f=188,g=205,h=209,k=62;
    	int befehlszahl=2;
    	int p=0;
    
    	gotoxy(27, 6); cout <<"                        "<<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl;
    	gotoxy(27, 7); cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 8); cout <<"                        "<<d<<"    TEST    "<<d<<endl;
    	gotoxy(27, 9); cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 10);cout <<"                        "<<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl;
    	gotoxy(27, 11);cout <<""<<endl;
    	gotoxy(27, 12);cout <<""<<endl;
    	gotoxy(27, 13);cout <<"                        "<<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl;
    	gotoxy(27, 14);cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 15);cout <<"                        "<<d<<"    TEST    "<<d<<endl;
    	gotoxy(27, 16);cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 17);cout <<"                        "<<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl;
    
    	gotoxy(x,y);
    	char ch=0;
    	while (ch!='\n')
        {      
            ch=0;
            if (kbhit()) ch=getch ();
            {
                if (ch==72)
    			{
        gotoxy(xpos(pos),ypos(pos));cout<<"   ";
        pos=(pos-1)%befehlszahl;
        gotoxy(xpos(pos),ypos(pos));cout<<"==>";
    			}
    		if (ch==80)
    		{
        gotoxy(xpos(pos),ypos(pos));cout<<"   ";
        pos=(pos+1)%befehlszahl;
        gotoxy(xpos(pos),ypos(pos));cout<<"==>";
    		}
    		}
    
    gotoxy(1,1);
    switch(pos)
    {
    	ch=0;
    case 0:cout<<"oberster Befehl";break;
    case 1:cout<<"zweiter Befehl";break;
    
    	while (ch!='\n')
    	{
    		if (kbhit()) ch=getch ();
    		{
    			if (ch==13)
    			{
    				if (pos==0)
    				{
    				gotoxy(27,18);
    				cout<<"muhkuh"<<endl;
    				}
    			}
    		}
    	}
    }
    	}
    }
    

    ?! 🙂



  • Sieht dein Quellcode wirklich so aus? Akzeptiert das dein Compiler?

    steve02 schrieb:

    if (kbhit()) ch=getch ();
            {
    

    mit dem ; ist der if() zu ende. D.h. der Block danach, der mit { beginnt wird immer ausgeführt. Das macht zwar nichts, sieht aber etwas seltsam aus.

    switch(pos)
    {
    -->	ch=0; <--
    case 0:cout<<"oberster Befehl";break;
    case 1:cout<<"zweiter Befehl";break;
    
    -->	while (ch!='\n')
    	{
    		if (kbhit()) ch=getch ();
    		{
    			if (ch==13)
    			{
    				if (pos==0)
    				{
    				gotoxy(27,18);
    				cout<<"muhkuh"<<endl;
    				}
    			}
    		}
    	}  <--
    }
    	}
    }
    

    Die markierten Bereiche dürften zumindest eine Warnung erzeugen. Die Initialisierung von ch solltest du vor dem switch() machen. Der Block mit dem while() wird normalerweise nie ausgeführt, da du kurz davor schon ein break hast.

    Hier mal ein Beispiel, wie ich das aufbauen würde (Pseudocode!):

    ...
    while(!ende)
    {
       if(anders_menu) //Wenn sich was am Menü geändert hat
          zeig_hauptmenu(sel_punkt); //Menü darstellen
    
       mach_was(); //hier kann man z.B. so Spielereien wie eine Uhr einbauen
    
       if(kbhit()) //nur Reagieren, wenn auch eine Taste gedrückt wurde; kann man weglassen, wenn man keine Spielereien hat ;)
       {
          switch(getch())
          {
             case 0: //Sondertasten, wie Pfeiltasten
                switch(getch())
                {
                   case pfeil_hoch: //Pfeil-Hoch-Taste
                      if(sel_punkt > min_punkt)
                         --sel_punkt;
                      break;
                   case pfeil_runter: //Pfeil-Runter-Taste
                      if(sel_punkt < max_punkt)
                         ++sel_punkt;
                      break;
                }
                break;
             case ESC: //Escape-Taste
                ende = 1;
                break;
             case ENTER: //Enter-Taste
                zeig_untermenu(sel_punkt);
                break;
          }
       }
       else
       {
          Sleep(1); //WinAPI-Funktion, die x Millisekunden wartet und dabei Systemressourcen wieder an das OS (Windows) abgibt.
       }
    }
    ...
    

    Edit: Sleep() eingefügt



  • @AJ:
    Wie schnell laeuft das Ding? Ich habe mal was aehnliches gemacht und das hat dann mit 100%CPU auf einen Tastendruck gewartet... da ich es ned besser wusste hab ich dann irgendwo etwas wie: if(!kbhit()) sleep(50); gemacht. Was die CPU auslastung auf 1% gesenkt hat.
    Wie würdest Du das lösen und wo würdest Du sowas reinpacken zB. in deinem Vorschlag?



  • AJ schrieb:

    steve02 schrieb:

    if (kbhit()) ch=getch ();
            {
    

    mit dem ; ist der if() zu ende. D.h. der Block danach, der mit { beginnt wird immer ausgeführt. Das macht zwar nichts, sieht aber etwas seltsam aus.

    Wofür überhaupt kbhit()? Es wird noch eh nichts anderes gemacht?!

    AJ schrieb:

    switch(pos)
    {
    -->	ch=0; <--
    case 0:cout<<"oberster Befehl";break;
    case 1:cout<<"zweiter Befehl";break;
    
    -->	while (ch!='\n')
    	{
    		if (kbhit()) ch=getch ();
    		{
    			if (ch==13)
    			{
    				if (pos==0)
    				{
    				gotoxy(27,18);
    				cout<<"muhkuh"<<endl;
    				}
    			}
    		}
    	}  <--
    }
    	}
    }
    

    Die markierten Bereiche dürften zumindest eine Warnung erzeugen. Die Initialisierung von ch solltest du vor dem switch() machen. Der Block mit dem while() wird normalerweise nie ausgeführt, da du kurz davor schon ein break hast.

    Doch, wenn pos weder 0 noch 1 ist.



  • Sgt. Nukem schrieb:

    AJ schrieb:

    Die markierten Bereiche dürften zumindest eine Warnung erzeugen. Die Initialisierung von ch solltest du vor dem switch() machen. Der Block mit dem while() wird normalerweise nie ausgeführt, da du kurz davor schon ein break hast.

    Doch, wenn pos weder 0 noch 1 ist.

    Falsch: Wenn keine der case-Bedingungen zutrifft, wird entweder der Block hinter "default:" ausgeführt oder der Inhalt des switch() komplett übersprungen - was vor dem ersten case bzw. zwischen einem break und dem nächsten case bzw. dem Blockende steht, ist unerreichbar.

    @steve: Und selbst wenn, an dieser Stelle ist die Schleife unnötig, weil der switch() in dem Moment erreicht wird, wenn du auf die ENTER-Taste gedrückt hast:

    //Kurzfassung:
    while(ch!='\n')//Abbruch der Schleife mit ENTER
    {
      if(kbhit())
      {
        ch=getch();
        if(ch==...)//Auswertung der Tasten
          ...
      }
    };
    
    //Hier hat der User ENTER gedrückt und seinen Wunsch-Menüpunkt ausgewählt - welcher das ist, steht in pos
    //also mußt du an dieser Stelle den Inhalt von pos auswerten, um die richtige Fortsetzung zu finden
    


  • Gasti schrieb:

    @AJ:
    Wie schnell laeuft das Ding? Ich habe mal was aehnliches gemacht und das hat dann mit 100%CPU auf einen Tastendruck gewartet... da ich es ned besser wusste hab ich dann irgendwo etwas wie: if(!kbhit()) sleep(50); gemacht. Was die CPU auslastung auf 1% gesenkt hat.
    Wie würdest Du das lösen und wo würdest Du sowas reinpacken zB. in deinem Vorschlag?

    Stimmt das Sleep() ist noch abgegangen und ist jetzt nachgetragen im Beispiel. Dort macht es auch nur in Verbindung mit kbhit() Sinn.



  • Also ich habs jezze komplett neu geschrieben also auch anders
    Nun siehts so aus:

    #include "iostream.h"
    #include "stdio.h"
    #include "stdlib.h"
    #include "conio.h"
    #include "Windows.h"
    
    void gotoxy(short x, short y)
    {
        HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD position = { x , y };
    	SetConsoleCursorPosition(hStdout, position);
    }
    int main()
    {
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	CONSOLE_CURSOR_INFO CCI;
    	GetConsoleCursorInfo(hOut, &CCI);
    	CCI.bVisible = false;
    	SetConsoleCursorInfo(hOut, &CCI);
    
    	int key, a=7, b=1, c=13, d=1;
    
    	cout<<"\n\tMenupunkt1\n\n\n\tMenupunkt2\n\n\n\tMenupunkt3";
    	gotoxy(a,b);
    	cout<<"-";
    	gotoxy(c,d);
    	cout<<"-";
    
    	do
    	{
    		key = getch();
    		switch (key)
    		{
    		case 72:
    			{
    				if (a==7&&b==1&&c==13&&d==1)
    				{
    					gotoxy(a,b);
    					cout<<"";
    					gotoxy(c,d);
    					cout<<"";
    					gotoxy(a=7,b=7);
    					cout<<"-";
    					gotoxy(c=13,d=7);
    					cout<<"-";
    				}
    				else
    				{
    					gotoxy(a,b);
    					cout<<"";
    					gotoxy(c,d);
    					cout<<"";
    					b=b-3;
    					d=d-3;
    					gotoxy(a,b);
    					cout<<"-";
    					gotoxy(c,d);
    					cout<<"-";
    				}
    			}
    			break;
    
    		case 80:
    			{
    				if (a==7&&b==1&&c==13&&d==1)
    				{
    					gotoxy(a,b);
    					cout<<"";
    					gotoxy(c,d);
    					cout<<"";
    					gotoxy(a=7,b=7);
    					cout<<"-";
    					gotoxy(c=13,d=7);
    					cout<<"-";
    				}
    				else
    				{
    					gotoxy(a,b);
    					cout<<"";
    					gotoxy(c,d);
    					cout<<"";
    					b=b+3;
    					d=d+3;
    					gotoxy(a,b);
    					cout<<"-";
    					gotoxy(c,d);
    					cout<<"-";
    				}
    			}
    			break;
    
    		case 13:
    			{
    				if (b==1&&d==1)
    				{
    					system ("cls");
    					cout<<"Menupunkt1 wird gestartet";
    				}
    				if (b==4&&d==4)
    				{
    					system ("cls");
    					cout<<"Menupunkt2 wird gestartet";
    				}
    				if (b==7&&d==7)
    				{
    					system ("cls");
    					cout<<"Menupunkt3 wird gestartet";
    				}
    			}
    			break;
    		}
    			while(1);
    			return(0);
    			getch();
    	}
    }
    

    Das prob aber grad is ich bekomm nen Syntax Error bei der letzten schließenden Klammer 😕



  • Dann achte mal genau darauf, welche schließende Klammer zu welcher öffnenden gehört (kleiner Tip: saubere Einrückung hilft da ungemein).

    PS: versuch mal dein gotoxy()-Gekurve klarer zu strukturieren - da verliert man leicht den Überblick.



  • jo ich hab mal nachgeschaut also alle offenen Klammern ham ne geschlossene Fehler besteht trotzdem weiter .

    :\c++\menu gut\menu gut.cpp(117) : error C2059: Syntaxfehler : '}'

    das ist die Fehlermeldung



  • steve02 schrieb:

    int main()
    {
      do
      {
        key = getch();
        switch (key)
        {
        case 72:
          {
            if (a==7&&b==1&&c==13&&d==1)
            {
            }
            else
            {
            }
          }//case 72
          break;
        case 80:
          {
            if (a==7&&b==1&&c==13&&d==1)
            {
            }
            else
            {
            }
          }//case 80
          break;
        case 13:
          {
            if (b==1&&d==1)
            {
            }
            if (b==4&&d==4)
            {
            }
            if (b==7&&d==7)
            {
            }
          }//case 13
          break;
        }//switch
        while(1);
      }//do
    }
    

    Ich hab' mal alle Anweisungen außer den Verschachtelungen rausgeschmissen und bei jedem } dazugeschrieben, zu welchem Block sie gehören - das while(1) sollte eigentlich hinter dem Block stehen, der von do... eingeleitet wird.



  • jo so hat ich ja auch noch ma zur übersicht gemacht kommt aufs gleiche raus
    der c++\menu gut\menu gut.cpp(116) : error C2059: Syntaxfehler : '}' Fehler
    ich dreh so langsam aber sicher a bissel durch 😮



  • Hast du eventuell vor dem angekreideten } ein Semikolon vergessen?



  • nop alle da
    😞


Anmelden zum Antworten