immerwieder diese Pfeiltasten
-
#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
-
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 -.-