Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   wann wird eine If Abfrage verlassen (https://www.delphipraxis.net/183550-wann-wird-eine-if-abfrage-verlassen.html)

bernhard_LA 19. Jan 2015 08:52


wann wird eine If Abfrage verlassen
 
wir verwenden folgenden Code

Delphi-Quellcode:
  If (length(ValueA)=0) or (length(ValueA)> 0 and ValueA[0] < 1) then
     begin
        doA(...);
     end
     else
     begin
        doB(...)
     end;


Auf einem Arbeitsplatzsystem (Win7, DELPHI XE2) wird der gesamte Code fehlerfrei ausgeführt. Dh. Falls die Länge von ValueA = 0 dann verzichtet er auf eine Prüfung von (length(ValueA)> 0 and ValueA[0] < 1);

Auf einem zweiten System versucht sich aber immer auch noch an der Prüfung von (length(ValueA)> 0 and ValueA[0] < 1) und wirft eine AV wenn length(ValueA)=0.
Warum bricht Delphi die Abfrage nicht immer ab wenn die erste Bedingung erfüllt ist, die zweite bräuchte er ja nicht mehr zu prüfen ...

Mavarik 19. Jan 2015 08:54

AW: wann wird eine If Abfrage verlassen
 
{$B-}

Mavarik

Sherlock 19. Jan 2015 08:56

AW: wann wird eine If Abfrage verlassen
 
Das ist eine Compiler-Option. Die nennt sich vollständige boolsche Auswertung. Wenn das auf "False" steht, dann bricht die Auswertung ab, sobald das Ergebnis feststeht. Bei "verundeten" Ausdrücken, dann also beim ersten False - bei "veroderten" beim ersten True.

Sherlock

mkinzler 19. Jan 2015 08:57

AW: wann wird eine If Abfrage verlassen
 
Das kann man Einstellen. Bei ein und dem selben Kompilat sollte es sich aber auf allen Rechnern identisch verhalten

http://docwiki.embarcadero.com/RADSt...r-Direktive%29

himitsu 19. Jan 2015 09:20

AW: wann wird eine If Abfrage verlassen
 
Zitat:

Delphi-Quellcode:
If (length(ValueA) = 0) or (length(ValueA) > 0 and ValueA[0] < 1) then

Und dann fehlen hier auch nich ein paar Klammen, denn es müsste ja eigentlich so aussehn
Delphi-Quellcode:
If (length(ValueA) = 0) or ((length(ValueA) > 0) and (ValueA[0] < 1)) then


Und da das Length>0 zwangsläufig True sein muß, wenn Length=0 nicht angeschlagen hat, könnte man es auch weglassen.
Delphi-Quellcode:
If (length(ValueA) = 0) or (ValueA[0] < 1) then



Standardmäßig sollte diese Option besser deaktiviert bleiben und ansonsten nur lokal dort aktiv, für die einen IF-Auswertung, bzw. für die eine Unit, wo es unbedingt aktiv sein muß.
Drum bringt es hier natürlich auch erstmal nichts, wenn man drüber nachdenken würde, was man wie ändern muß, wenn diese Option aktiv wäre. (in mehrere IFs aufteilen)
Also wenn in den Projektoptionen aktiv, dann dort abschalten.

Der schöne Günther 19. Jan 2015 09:43

AW: wann wird eine If Abfrage verlassen
 
Warum das in Delphi ein globaler (ziemlich auffälliger) Compilerschalter ist und nicht wie in so ziemlich allen Sprachen ein "&&" bzw "&" habe ich nie verstanden...

Jumpy 19. Jan 2015 09:44

AW: wann wird eine If Abfrage verlassen
 
Was ist denn eigentlich ValueA?

Ein String? Dann kann doch das nicht klappen: ValueA[0] < 1

Oder ist das ein Array of Integer oder sowas?

mkinzler 19. Jan 2015 09:56

AW: wann wird eine If Abfrage verlassen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1287016)
Warum das in Delphi ein globaler (ziemlich auffälliger) Compilerschalter ist und nicht wie in so ziemlich allen Sprachen ein "&&" bzw "&" habe ich nie verstanden...

Du kannst ihn auch lokal setzen

himitsu 19. Jan 2015 10:01

AW: wann wird eine If Abfrage verlassen
 
Zitat:

Zitat von Jumpy (Beitrag 1287017)
Was ist denn eigentlich ValueA?

Ein String kann es nicht sein, da sonst der Compiler gemecktert hätte ... vonwegen der Kompatibilität zwischen Char und Integer. :angel2:
Und die neuen Strings, in den mobilen Plattformen, sind nun standardmäßig auch 0-basierend.

p80286 19. Jan 2015 10:09

AW: wann wird eine If Abfrage verlassen
 
Und was ist mit dem allseits beliebten
Delphi-Quellcode:
if (length(a)>0) and (copy(a,1,1)='H') then
bei einem Leerstring würde die vollständige Auswertung nicht so doll sein
Bei einer ganzen Latte von ifs die sich mit einem String beschäftigen wäre eine Aufteilung natürlich sinnvoller (da gibts dann keine vollständige Auswertung mehr):
Delphi-Quellcode:
if length(a)>0 then begin
  if copy(a,1,1)='G' then..
  if a[length(a)]='\' then ...
end;
Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz