immerwieder diese Pfeiltasten



  • @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
    😞



  • Kurze Zwischenfrage: Über welches } genau beschwert sich der Compiler?

    Ansonsten:

    do
    {
      if(kbhit()) key=getch();
      switch(key)
      {
        ...
      }
      while(1);//leere Endlos-Schleife
    }//ende do
    //hier fehlt die Abbruchbedingung -> Fehler
    

    Du hast das while(1) an der falschen Stelle (aber das wollte ich dir mit meinem vorletzten Beitrag schon erklären).

    PS: das "getch();" hinter der return-Anweisung ist übrigens auch sinnlos.



  • ehm wie sollte die Abbruchbedingung aussehen?
    er beschwert sich über die letzte schließende Klammer
    und jo das mit dem getch dem letzten war noch von nem Test von vorher deswegen stand der noch drin mein fehler 🙂



  • do
    {
      ...
    }while(ch!='\n');//als Beispiel
    

    GANZ WICHTIG ist, daß das while an der richtigen Stelle steht, sonst wird es als (leere) while()-Schleife interpretiert.

    (PS: Muß man dir eigentlich alle buchstabieren, damit du es verstehst? Oder versuchst du auch mal, die Antworten komplett zu lesen - und zu verstehen?)



  • ich bin ein fauler Mensch 🙂
    ich studiere Physik und mache das Programmieren nur nebenbei und beim Studium muss ich genug nachdenken.
    Deswegen ist es ja schön das es so nette hilfsbereite Leute wie dich gibt 😉



  • steve02 schrieb:

    Deswegen ist es ja schön das es so nette hilfsbereite Leute wie dich gibt 😉

    Das glaube ich dir gerne - nur das Denken wollte ich dir eigentlich nicht abnehmen 😃
    (wenn du studierst, solltest du dazu selber in der Lage sein :D)



  • du weest ja zwischen Physik und Informatik gibts so ein paar kleine Unterschiede 😉



  • *edit*edit es geht nun ..tjo aber ich hab keine Ausgabe ^^
    also ich hab kein Text obwohl er da is 😕
    also es fehlt der Text die Menupunkte sin da un wenn ich enter drücke startet der auch des aber halt ohne visuelle ausgabe. desweiteren springt der Cursor wenn ich nach unten drück nich zu menu2 sondern gleich menu3 ajo un irgendwie werden die "-" nicht gelöscht wenn ich pfeiltaste drück..aber mal abgesehn davon funktionierts -.-



  • steve02 schrieb:

    *edit*edit es geht nun ..tjo aber ich hab keine Ausgabe ^^
    also ich hab kein Text obwohl er da is 😕

    Was heißt das genau?

    also es fehlt der Text die Menupunkte sin da un wenn ich enter drücke startet der auch des aber halt ohne visuelle ausgabe.

    Setz mal einen Breakpoint int den "case 13:"-Zweig und schau nach, wie dort die Variablen belegt sind.

    desweiteren springt der Cursor wenn ich nach unten drück nich zu menu2 sondern gleich menu3

    Ich tippe auf einen Fehler bei deinem gotoxy()-Gekurve, aber da blicke ich nicht mehr durch.

    ajo un irgendwie werden die "-" nicht gelöscht wenn ich pfeiltaste drück..aber mal abgesehn davon funktionierts -.-

    Du mußt zum Löschen der Pfeile genausoviel Leerzeichen schreiben wie du vorher Zeichen hingesetzt hast - ein leerer String reicht dafür nicht aus. (oder in Deutsch: Ersetz' die cout<<"" in deinen Abfragen durch cout<<" ")

    du weest ja zwischen Physik und Informatik gibts so ein paar kleine Unterschiede 😉

    Vielleicht bei den Methoden, aber denken (und Texte verstehen) muß man in beiden Fächern genauso.



  • jo also die textausgabe geht jezze ich musste "flush" dahintermachen..also puffer leeren das mit dem das er zu punkt drei dierekt springt hab ich auch gelößt bleibt nur des prob das der die striche nit löscht


Anmelden zum Antworten