![]() |
for-Schleife -Abbruch
Hallo,
ich möchte in einer for-Schleife gewisse Durchläufe überspringen: Das könnte ich so machen:
Delphi-Quellcode:
Allerdings habe ich viele if-Abfragen, die ineinander verschachtelt sind, doch ich kann sie nicht mit einem AND verknüpfen, da gewisse innere nicht abgefragt werden dürfen, wenn die äußere(n) FALSE liefert.
for x:=a to b do begin
if f(x)>100 then begin ... end; end; Ich möchte soetwas wie:
Delphi-Quellcode:
Das wäre besser, doch bei mir wird die komplette Schleife beendet. Ich möchte aber nur gewisse Durchläufe überspringen.
for x:=a to b do begin
if not (f(x)>100) then Exit; ... end; Bitte um Hilfe, Thomas |
AW: for-Schleife -Abbruch
Zitat:
Delphi-Quellcode:
Gruß, Chris
for x:=a to b do begin
if not (f(x)>100) then continue; ... end; |
AW: for-Schleife -Abbruch
|
AW: for-Schleife -Abbruch
Zitat:
Sobald eine Bedingungen in der if-Abfrage fehlschlägt, werden alle folgenden nicht mehr geprüft. Kannst also schon Schachteln! Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin if GetAFalseBooleanValue and GetATrueBooleanValue then OutputDebugString(PWideChar('Wird niemals erreicht')); end; function TForm1.GetAFalseBooleanValue: Boolean; begin Result := False; OutputDebugString(PWideChar('False - Siehtste mich???')); end; function TForm1.GetATrueBooleanValue: Boolean; begin Result := True; OutputDebugString(PWideChar('True - Siehtste mich???')); end; |
AW: for-Schleife -Abbruch
Ach, so einfach :-D
Ich wusste doch, dass es einen Befehl dafür gibt ^^ Vielen Dank - so sieht mein Programm viel ordentlicher aus ! Thomas Edit: Zum "Schachteln" habe ich mich nicht so deutlich ausgedrückt, ich meinte soetwas:
Delphi-Quellcode:
Allerdings benütigt die Funktion "qx" schon einen numerischen nichtleeren String "a", ansonsten Fehler.
if (a<>'') and (isnumeric(a)) and qx(a) then begin
s:= a... end; Daher muss ich machen:
Delphi-Quellcode:
so in der Art...
if (a<>'') and isnumeric(a) then begin
if qx(a) then s:=... end; |
AW: for-Schleife -Abbruch
Zitat:
Bitte mein Beispiel mal ausprobieren! Für dein Beispiel: Sobald (a<>'') gleich false liefert, werden alle anderen Bedingungen die zwischen if und then stehen nicht abgefragt! EDIT: Würde die Prüfung sowieso in die IsNumeric() Funktion implementieren! |
AW: for-Schleife -Abbruch
Zitat:
Gruß, Chris |
AW: for-Schleife -Abbruch
Zitat:
|
AW: for-Schleife -Abbruch
Warum das Ganze nicht übersichtlich verpacken?
Delphi-Quellcode:
Function OperationIstLegal(KandidatenIndex : Integer) : Boolean;
Begin Result := False; If KandidatIstLeer(KandidatenIndex) Then Exit; If Not KandidatIstNumerisch(KandidatenIndex) Then Exit; If KandidatHatRoteHaare(KandidatenIndex) And HeuteIstDienstag() Then Exit; // Hier beliebig viele Prüfungen einfügen, anfügen, erklären usw. // // Und zum Schluss Result := True; End; Procedure DieEigentlicheSchleife; Var i : Integer; Begin For i:=1 to VerdammtHoheZahl do If OperationIstLegal(i) then FuehreOperationAus(i); End; |
AW: for-Schleife -Abbruch
Erst schreibst du übersichtlich und dann widersprichst du dir indem du Exit in dieser Art und Weise benutzt... ;-)
|
AW: for-Schleife -Abbruch
Hallo und danke für die vielen Antworten :)
Am Beispiel habe ich ausprobiert, dass "A AND B" einen Fehler ergibt. Weiß vielleicht jemand, wo ich das umstellen kann ? Müsste ja irgendwo in "Compilereinstellungen" sein... (In meiner Signatur steht, was ich benutze.) Die Idee, die Überprüfung in der Funktion selbst einzubauen, ist aber wohl die beste (leddls Beitrag) ! |
AW: for-Schleife -Abbruch
Zitat:
Ich finde es sehr übersichtlich. Und lesbar. Und kompakt. Wie würdest Du das denn umsetzen, das es ebenso lesbar und kompakt und nicht redundant ist? |
AW: for-Schleife -Abbruch
Genau. Ich persönlich finde es außerordentlich übersichtlich, wenn am Anfang einer Funktion die Bedingungen aufgelistet sind, unter denen sie nicht abgearbeitet werden soll (Objekt noch nicht komplett initialisiert, falsche Parameter, ungültige Zeiger...). Wo kann es eine sinnvollere Verwendung für das "exit" geben als hier?
|
AW: for-Schleife -Abbruch
Bei dem genannten Beispiel ist das halt kürzer und ein Exit ist unnötig, da vor/nach den Exit's nur das booleanische Result gesetzt wird ... also kann man die Ifbedingungen auch direkt an das Result weitergeben.
Delphi-Quellcode:
also demnach so
// man schreibt ja auch
Result := irgendwas; // und nicht if irgendwas then Result := True else Result := False; // oder Result := False; if irgendwas then Result := True; // oder eben das genannte Result := False; if not irgendwas then Exit; Result := True;
Delphi-Quellcode:
function OperationIstLegal(KandidatenIndex: Integer): Boolean;
begin Result := not KandidatIstLeer(KandidatenIndex) and KandidatIstNumerisch(KandidatenIndex) and not (KandidatHatRoteHaare(KandidatenIndex) and HeuteIstDienstag); end; |
AW: for-Schleife -Abbruch
himitsu, ein Widerspruch ist das ja nicht, nur Geschmackssache.
Egal wie: Eine Entscheidungsfunktion hat den großen Vorteil, das sie direkt lesbar, einfach wartbar und noch einfacher erweiterbar ist, und darum geht es doch in erster Linie bei der Programmierung. Die Entscheidung findet an einer zentralen (EINE), benannten (KOMMENTIERTE) und ausgelagerten (FUNKTION) Stelle statt. Die Bedingungen sind untereinander von der Aussage her äquivalent, denn sie benennen immer genau eine Bedingung, weshalb die Operation illegal ist. Solange Du deine Entscheidungsfunktion auslagerst, und ordentlich refaktorisierst, kannst Du das natürlich auch mit einer AND/OR-Verknüpfung machen. Einen fundamentalen Unterschied sehe ich hier aber nicht. Für mich ist meine Version meistens leichter zu lesen, das kann aber auch am Alter liegen. Übrigens: Um A AND B so kompilieren zu lassen, das B nur dann evaluiert wird, wenn A TRUE ergibt, geht man in die Kompileroptionen und sucht nach etwas wie "komplette bool'sche Ausdrücke' oder ähnlich. Bei mir war das in den Optionen unten links, aber ich habe gerade kein Delphi. |
AW: for-Schleife -Abbruch
Das dort umzuschalten ist aber keine so gute Idee. Besser ist es das an der Stelle zu schreiben, die eine bestimmte Einstellung voraussetzt.
Sprich:
Delphi-Quellcode:
Denn wenn man das in den Projektoptionen einstellt (wobei das aus Optimierungsgründen auch die Voreinstellung ist), verlässt man sich darauf, dass es dort korrekt eingestellt ist. Wenn aber jemand anderes das dort umstellt, kann er sich über die Folgen nicht bewusst sein, da dort ja keinerlei Bezug zu dem Quelltext besteht, wo die Einstellung ggf. anders benötigt wird.
function OperationIstLegal(KandidatenIndex: Integer): Boolean;
begin {$BOOLEVAL OFF} Result := not KandidatIstLeer(KandidatenIndex) and KandidatIstNumerisch(KandidatenIndex) and not (KandidatHatRoteHaare(KandidatenIndex) and HeuteIstDienstag); end; Zitat:
In diesem Fall ist das noch akzeptabel, aber ich habe schon Quelltexte gesehen wo ich große Mühe hatte den Quelltext genau nachzuvollziehen warum wo rausgesprungen wird und warum wo der Rückgabewert vorher gesetzt wurde... Nebenbei gilt für mich der Grundsatz: Ein Befehl pro Zeile. Das Exit irgendwo hinten in der Zeile zu verstecken (statt es in eine neue Zeile zu schreiben) ist zusätzlich... suboptimal. |
AW: for-Schleife -Abbruch
Zitat:
Delphi-Quellcode:
Siehe auch
// Shortcuts einschalten
{$B-} // oder {$BOOLEVAL OFF} // Shortcuts ausschalten {$B+} // oder {$BOOLEVAL ON} ![]() Ich glaube auch, dass es eine lokale Einstellung ist, das heißt, dass du dies für einzelne Bedingungen ändern kannst (müsste das jedoch nachprüfen). Zur Semantik (vielleicht hattest du ja was vertauscht): Bei einem AND wird abgebrochen, wenn die erste Bedingung FALSE ergibt (die gesamte Bedingung kann eh nicht mehr TRUE ergeben). Bei einem OR wird abgebrochen, wenn die erste Bedingung TRUE ergibt (die gesamte Bedingung kann eh nicht mehr FALSE ergeben). Gruß, Sven PS: Die aktuelle Version von Lazarus ist mittlerweile 0.9.30 mit Free Pascal 2.4.2. Wenn du noch etwas wartest sollte auch bald 0.9.30.2 (mit Free Pascal 2.4.4) veröffentlicht werden. |
AW: for-Schleife -Abbruch
Danke, für die Antworten.
Jetzt ist es mir sehr klar geworden. Die neue Version habe ich vor kurzem schon bereits probiert zu installieren, habe es nach einiger Zeit wegen zu vielen mir unbekannten Fehlern aufgegeben. Zusätzlich müsste ich die IDE dann noch neu kompilieren, weil ich sehr viel daran geändert habe (Komponenten hinzugefügt). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz