Logik / Verständniss Problem ^^
-
Irgendwie kann ich soweit net denken und raffs einfach net wie ich das umsetzen kann...
Ich hab im Menü den Eintrag Pause.
Wenn die Straße nicht sichtbar ist und man drückt auf pause soll nichts passieren.
if(street->Visible==false) { }
Sonst sollen die timer angehalten werden, und Pause = Checked
else { timer1->Enabled=false; timer2->Enabled=false; timer3->Enabled=false; timer4->Enabled=false; Pause1->Checked=true; }
Und jetzt komm ich nicht mehr weiter, wenn pause = checked und man drück jetzt auf pause sollen die timer wieder weiterlaufen und pause->Checked=false;
aber ich bekomm das einfach net hin...
Wär super wenn mir jemand helfen könnteif((street->Visible==true) && (timer1->Enabled==false)) { timer1->Enabled=true; timer2->Enabled=true; timer3->Enabled=true; timer4->Enabled=true; Pause1->Checked=false; }
-
if(street->Visible==true) // es geschieht nur etwas wenn Straße sichtbar { if(!Pause1->Checked) // wenn Pause nicht gedrückt { Timer1->Enabled= false; Timer2->Enabled= false; Timer3->Enabled= false; Timer4->Enabled= false; Pause1->Checked= true; } else // wenn Pause gedrückt { Timer1->Enabled= true; Timer2->Enabled= true; Timer3->Enabled= true; Timer4->Enabled= true; Pause1->Checked= false; } }
So?
MfG
-
Danke
Einfach top
-
@Kolumbus
Die zweite if Abfrage ist unnötig.
Überleg mal:if(!Pause1->Checked)
also wenn Pause1 nicht gesetzt (false) dann alle Timer auf false.
dann reicht einfach ein
Timerx->Enabled= Pause1->Checked
und zum Schluss ein
Pause1->Checked= !Pause1->Checked;
-
Ja opti,
Recht hast du... aber ich denke für stetze ist es so besser nachvollziehbar. Ein kurzer Code ist nicht alles - er muss auch dem Entwickler nach 3 Monaten anderweitiger Beschäftigung noch leicht verständlich sein.
Aber trotzdem der Vollständigkeit halber:
if(street->Visible==true) { Timer1->Enabled= Pause1->Checked; Timer2->Enabled= Pause1->Checked; Timer3->Enabled= Pause1->Checked; Timer4->Enabled= Pause1->Checked; Pause1->Checked= !Pause1->Checked; }
reicht völlig aus stetze!
MfG
-
außerdem reicht statt
if(street->Visible==true)
besser
if(street->Visible)
-
Ja, genau!
Und jetzt kommt bestimmt gleich noch einer, der weiß dass man die Timer ja auch in ein Array packen kann und dann über eine Schleife aktivieren / deaktivieren kann, wodurch nochmal 2 Codezeilen eingespart werden
-
Das habe ich ja ganz vergessen zu erwähnen.
-
Beide völlig falsch. Optimalerweise verwendet man nur einen einzigen Timer.
-
Kolumbus schrieb:
Ja, genau!
Und jetzt kommt bestimmt gleich noch einer, der weiß dass man die Timer ja auch in ein Array packen kann und dann über eine Schleife aktivieren / deaktivieren kann, wodurch nochmal 2 Codezeilen eingespart werdenDein Ärger, wenngleich Smiley-garniert, ist unangemessen. Das von Braunstein kritisierte
if(street->Visible==true)
ist nicht redundant, sondern schlicht falsch. Rate mal warum
-
Hmm... weil es nicht den Inhalt der Eigenschaft überprüft, sondern nur die Existenz der Eigenschaft?
Edit: Einfach mal so drauflos geraten...
-
Also ich seh da keinen Fehler...
Das wird doch aufgelöst zuif (true==true)
oder zu
if (false==true)
Die Bedingung wird also korrekt ausgeführt, wenn Visible true ist.
Grüße Joe_M.
-
Zunächst muß ich mich korrigieren und das doch noch etwas einschränken: solange nur mit bool-Variablen verglichen wird, ist der Vergleich mit true in Ordnung. Sobald aber z.B. ein Integerwert, z.B. der Rückgabewert einer WinAPI-Funktion ("If the function succeeds, the return value is nonzero."), mit true oder TRUE verglichen wird, ist diese Schreibweise fehlerhaft, denn während true und TRUE einen konkreten Wert haben, signalisiert jeder Rückgabewert ungleich Null den Erfolg der Funktion. Beispiel:
int doSomethingAndReturnState (void) { if (...) return 0; // failed if (...) return 2; // succeed the one way ... return 1; // succeed the other way } ... if (doSomethingAndReturnState () == true) // dies erfaßt den Rückgabewert 2 nicht! ...
Dies und die Tatsache, daß if, while und der Mittelteil eines for-Schleifenkopfes ohnehin bereits einen bool-Wert erwarten, sollten Grund genug sein, auf diese Schreibweise zu verzichten.
-
Was denn nun? Also gibts doch keinen Haken bei
if(street->Visible)
. Super, dann hätten wir das ja geklärt
-
Das muss ich alles nicht verstehen
oder^^
-
Doch, eigentlich schon.
Es geht darum, dass man Integerwerte nicht mir true vergleichen darf, obwohl definiert ist, dass false gleich 0 ist und true ungleich 0. Aber die Konstante true ist als 1 definiert. Dies kann zu Logikfehlern führen.
Bei audacias Beispiiel wird die Bedingungen beim Rückgabewert 2 false, obwohl 2 != 0 und man somit erwarten könnte, dass die Bedingung true ist. Also muss man entweder implizit oder explizit nach bool casten.
Implinzit wäre, auf den Vergleich mit true zu verzichten:
if (doSomethingAndReturnState ())
Das Ergebnis wird implizit nach bool gecastet, jeder Wert != 0 ergibt true.
Explizit wäre, das Ergebnis nach bool zu casten:
if (bool(doSomethingAndReturnState ()) == true)
Das Ergebnis wird explizit nach bool gecastet, somit wird aus dem Rückgabewert 2 der logische Wert 1 und der Vergleich ist zulässig.
Und das funktioniert eben nicht:
if (doSomethingAndReturnState () == true)
Der Rückgabewert ist 2 und wird mit 1 (true) verglichen. Und da 2 != 1 ist...
Ist es so verständlicher?
-
ganz ehrlich ^^ nö... is mir alles zu hoch... funktioniert doch auch mit
Visible==true
-
Hallo
Wenn Visible vom Typ bool ist, ist das ja auch korrekt. Joe aber erklärt was zu beachten ist wenn an der Stelle von Visible kein Typ bool steht, sondern Typ int.
bis bald
akari