Alternativen für goto :/
-
Hi,
vielleicht könnt ihr mir bei meinem Problem helfen. Ich möchte ein Programm schreiben das Mausklicks auf einem Pixel simuliert wenn ich Shift drücke (und es soll aufhören wenn ich Shift erneut drücke). Ich lerne C++ erst seit ein paar Tagen und habe keine besser Möglichkeit gefunden das Programm nach dem 2. Shiftdruck von anfang laufen zu lassen als mit goto
.#include <windows.h> const int KeyPressed = -32767; int CURSOR_X; int CURSOR_Y; int main() { mark1 : //Fail 1 while (1) { if (GetAsyncKeyState(VK_LSHIFT) == KeyPressed) { mark2 : //Fail 2 POINT cursorPos; GetCursorPos(&cursorPos); CURSOR_X = cursorPos.x; CURSOR_Y = cursorPos.y; Sleep(2); SetCursorPos(CURSOR_X,CURSOR_Y); mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); if (GetAsyncKeyState (VK_LSHIFT)== KeyPressed) { goto mark1; // Fail 1 } goto mark2; // Fail 2 } Sleep(1); } return 0; }Könnte sich eine Seele dazu bereit erklären eine oder zwei Alternativen für goto zu Posten?

Gruß Chrises
-
Könntest du nicht einfach eine Funktion schreiben und alles reinpacken und diese dann aufrufen?
Ich habe mal eine Frage an dich: Ich lerne auch C++ und bin vielleicht jetzt kein blutiger Anfänger mehr, doch bin ich immernoch dabei wirklich alle Grundlagen zu vertiefen. Jetzt wo ich dein Projekt sehe, frage ich mich, wie du C++ lernst (da du ja erst seit ein paar Tagen lernst). In welchem Anfangsbuch oder Tutorial lernt man denn so was? Oder bringst du Erfahrungen aus anderen Sprachen mit?
Vielen Dank
lg, freakC++
-
Durch Umgestalten der Schleife und anderen if-Abfragen, negation, und / oder "continue" müsstest Du beide GOTOs wegbekommen. GOTO ist wirklich nur in ganz seltenen Fällen angebracht. Hioer geht es ganz ohne
-
Mit Schleifen natürlich. Das hier ist zwar noch nicht der Gipfel der Eleganz wegen der Endlosschleife, aber es zeigt, wie man deine GOTO Konstrukte leicht umschreiben kann:
#include <windows.h> const int KeyPressed = -32767; int CURSOR_X; int CURSOR_Y; int main() { while(true) { while(GetAsyncKeyState(VK_LSHIFT) == KeyPressed) { POINT cursorPos; GetCursorPos(&cursorPos); CURSOR_X = cursorPos.x; CURSOR_Y = cursorPos.y; Sleep(2); SetCursorPos(CURSOR_X,CURSOR_Y); mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } Sleep(1); } return 0; }
-
Es könnte etwa so aussehen (ungetestet):
[quote="Chrises"] [cpp] #include <windows.h> const int KeyPressed = -32767; int CURSOR_X; int CURSOR_Y; int main() { while (1) { if (GetAsyncKeyState(VK_LSHIFT) == KeyPressed) do { POINT cursorPos; GetCursorPos(&cursorPos); CURSOR_X = cursorPos.x; CURSOR_Y = cursorPos.y; Sleep(2); SetCursorPos(CURSOR_X,CURSOR_Y); mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } while(GetAsyncKeyState (VK_LSHIFT)!= KeyPressed); Sleep(1); } return 0; }
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Vielen Dank für die Antworten. Problem gelöst

@freakc++ Benutze das Buch : "jetzt lerne ich C++" ISBN 978-3-8272-4460-4 und meinen Nachbar der das schon mehrere Jahre macht :P. http://msdn.microsoft.com/en-us/library/default.aspx hilft auch oft weiter ;).
-
ich will ja nichts sagen aber goto considered harmful
-
Ist eigentlich nicht WinApi!
Goto und Sprungziele gehörten z.B. bei früheren BASIC-Compilern zum allgemeinen Werkzeug der Ablaufkontrolle. Und erzeugten dort schwer nachvollziehbaren Spagetti-Code. Kann man heute wirklich vermeiden! For-While-Switch-Break etc. reichen voll aus. Wenn nicht, stimmt etwas am Programmentwurf nicht! Wenn doch goto, dann bitte nur ans Ende einer Funktion und gut kommentieren.
-
berniebutt schrieb:
Ist eigentlich nicht WinApi!
Goto und Sprungziele gehörten z.B. bei früheren BASIC-Compilern zum allgemeinen Werkzeug der Ablaufkontrolle. Und erzeugten dort schwer nachvollziehbaren Spagetti-Code. Kann man heute wirklich vermeiden! For-While-Switch-Break etc. reichen voll aus. Wenn nicht, stimmt etwas am Programmentwurf nicht! Wenn doch goto, dann bitte nur ans Ende einer Funktion und gut kommentieren.das ist quatsch. schwer nachvollziehbarer spaghetti-code wird von schlechten und unfähigen programmiern erzeugt, nicht von goto. ich verwende goto manchmal, denn es kann manchmal durchaus helfen, um nicht unnötig aufgeblähten code zu erzeugen.
-
Die Schleife ist schrecklich, mit oder ohne goto.
Und wieso testest du mit == auf KeyPressed - du solltest eher mit(GetAsyncKeyState(key) & KeyPressed) != 0testen.
-
h@ck3R schrieb:
das ist quatsch. schwer nachvollziehbarer spaghetti-code wird von schlechten und unfähigen programmiern erzeugt, nicht von goto. ich verwende goto manchmal, denn es kann manchmal durchaus helfen, um nicht unnötig aufgeblähten code zu erzeugen.
Jo, ich habe nichts anderes gesagt. Du hast wahrscheinlich nie mit einem BASIC-Interpreter gearbeit, der nur goto zur Ablaufsteuerung kannte! Auch ich verwende manchmal noch goto, aber dann nur ans Ende einer Funktion. Anders habe ich keinen Überblick und Rücksprünge halte ich schlicht für unmöglich. daddeldu - fertig, das reicht.