Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 08.03.03 15:20 
Hab mal ne Frage, wie intelligent in Delphi (bzw. im fertigen Programm) Boolsche Ausdrücke auswertet werden. Ich hab nen Anweisungsblock, der nur dann ausgeführt werden soll, wenn 2 Bedingungen erfüllt sind. Das geht natürlich so:
ausblenden Quelltext
1:
2:
3:
4:
 if (Bed1) AND (Bed2) then 
begin
...
end;

Problem ist: Wenn Bed1 schon nicht erfüllt ist, kann es beim Testen, ob Bed2 erfüllt ist, zu einem "List INdex out of Bounds" kommen.

Frage: Bricht die Auswertung bei einem Ausdruck der Form if (Bed1) AND (Bed2)
sofort mit FALSE ab, wenn Bed1=False (was ja korrekt wäre), oder macht der trotzdem weiter?

(Bei mir scheint das so zu sein, denn wenn ich die Bedingungen umkehre, krieg ich den Fehler, anders nicht; aber ist dieses Verhalten auch auf anderen Rechnern garantiert, wenn ich die fertige .exe verteile?)

_________________
We are, we were and will not be.
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Sa 08.03.03 15:28 
Guck dir mal im Menü "Projekt > Optionen > Compiler > Boolisch Ausdrücke vollständig" an oder die Compilerschalter $B.


Zitat:
BOOLEVAL

Typ Schalter
Syntax {$B+} oder {$B-}
{$BOOLEVAL ON} oder {$BOOLEVAL OFF}
Vorgabe {$B-}
{$BOOLEVAL OFF}
Gültigkeitsbereich Lokal

Anmerkungen

Die Direktive $B schaltet zwischen zwei unterschiedlichen Modellen der Code-Generierung für die booleschen Operatoren and und or um.

Im Status {$B+} erzeugt der Compiler Code für die vollständige Auswertung eines Booleschen Ausdrucks. Das bedeutet, daß jeder Operand eines Booleschen Ausdrucks, der mit den Operatoren and und or gebildet wird, garantiert ausgewertet wird, auch wenn das Ergebnis des gesamtes Ausdrucks bereits feststeht.

Im Status {$B-} generiert der Compiler Code für die Kurzschlußauswertung Boolescher Ausdrücke, d.h. die Auswertung wird beendet, sobald das Ergebnis des gesamten Ausdrucks feststeht (die Auswertung erfolgt immer von links nach rechts).

_________________
Popov
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Sa 08.03.03 15:33 
Hi.

Gausi hat folgendes geschrieben:

Frage: Bricht die Auswertung bei einem Ausdruck der Form if (Bed1) AND (Bed2)
sofort mit FALSE ab, wenn Bed1=False


Kommt auf die Optionen an. Aber eigentlich ist das Sinn der Sache, denn der Ausdruck kann nicht mehr true ergeben und die Überprüfung der restlichen Bedingungen wäre unnütz.

Gausi hat folgendes geschrieben:

(Bei mir scheint das so zu sein, denn wenn ich die Bedingungen umkehre, krieg ich den Fehler, anders nicht; aber ist dieses Verhalten auch auf anderen Rechnern garantiert, wenn ich die fertige .exe verteile?)


Wenn das bei Dir so ist, ist es auch auf anderen Systemen so, weil es eine Sache des Compilers ist und diese Einstellungen ("Boolesche Ausdrücke vollständig auswerten" oder "Complete Boolean Eval" muss/sollte immer aus sein) gelten dann intern für Deine ganze Applikation.

Gruß,
Markus
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Mo 10.03.03 21:08 
DaFox hat folgendes geschrieben:
denn der Ausdruck kann nicht mehr true ergeben und die Überprüfung der restlichen Bedingungen wäre unnütz.

Nicht, wenn Du Funktionen mit Bool-Rückgabewerten verwendest, die auch noch andere Dinge verändern.
Da kann es schon mal wichtig sein, daß die Funktion ausgeführt wird.

OK. Mag ein Sonderfall sein, aber genau dafür kann man dann mit {$R+} die komplette Ausführung erzwingen.
In der Regel hast Du recht: Es macht keinen Sinn. Weshalb der Vorgabewert ja auch {$R-} ist.

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Di 11.03.03 14:03 
Wolff68, das ist richtig, aber ich rate davon ab. Jeder gute Source, jeder gute Programmierer verzichtet auf die vollständige Auswertung von Booleschen Ausrücken.
Ich verstehe auch nicht, dass jeder sein Programm geschwindigkeitsmäßig optimieren möchte, dann aber immer wieder eine Diskussion aufkommt, in der jmd erklärt wie wichtig es sein kann, dass man diese Compileroption benutzt. Die Funktion würde evtl. ausgeführt werden und es wäre wichtig für den weiteren Ablauf Deines Programms (wenn Du's so programmiert hast) aber der Ausdruck liefert trotzdem false zurück und somit war diese Konstruktion unglücklich gewählt.
Außerdem: Stell der mal das Debuggen eines solchen Konstrukts vor! :shock: Pfui; Ich verurteile niemanden, der so programmiert, aber ich mache das nicht und somit werde ich mich hüten jemandem diesen Programmierstil zu empfehlen.

Gruß,
Markus