![]() |
Funktionsaufrufe wegoptimiert???
Hallo,
ich lese verschiedene Einträge aus einem ini-File mit folgender Programm-Struktur:
Delphi-Quellcode:
Die Funktion FindEntry(F, 'A=', a); durchsucht das TextFile F nach der Zeile A=Zahl und speichert die Zahl in a ab. Falls keine solche Zeile gefunden wird, ist der Rückgabewert false, ansonsten true.
var a,b,c...: integer;
ok:=true ok:=ok and FindEntry(F, 'A=', a); ok:=ok and FindEntry(F, 'B=', b); ok:=ok and FindEntry(F, 'C=', c); ... Mit der Variable ok prüfe ich zum Schluss, ob alle Zeilen gefunden wurden. Nun mein Problem: Nehmen wir an, deine Zeile B=Zahl gibt es nicht in der Datei, Zeilen A=.. und C=... aber schon. Dann habe ich zum Schluß in a den Wert aus der Zeile A=..., die Abfrage nach B= schlägt fehl. Problem: Der Aufruf FindEntry(F, 'C=', c); findet dann nicht mehr statt, vermutlich, weil ok schon false ist. Ich hätte aber trotzdem die Variable c gerne aus der Datei geladen. Wo liegt mein Denkfehler? Irgendwie besitzt der Compiler eine andere Logik als ich. |
Re: Funktionsaufrufe wegoptimiert???
Dreh die Abfrage doch einfach um :
Delphi-Quellcode:
Dann wird immer erst die Function aufgerufen
ok:=FindEntry(F, 'A=', a) and ok;
|
Re: Funktionsaufrufe wegoptimiert???
was hältst du von:
Delphi-Quellcode:
:?:
ok:= FindEntry(F, 'A=', a) and FindEntry(F, 'B=', b) and FindEntry(F, 'C=', c);
|
Re: Funktionsaufrufe wegoptimiert???
Zitat:
|
Re: Funktionsaufrufe wegoptimiert???
Zitat:
Man kann einstellen, das logische Gleichungen bis zum Ende ausgewertet werden, aber das ist, zumindest meiner Meinung nach, schlechter Programmierstil: das Laden von Variablen ist ein Nebeneffekt der logischen Abfrage, und dein Programm erklärt praktisch die Nebenwirkung zum eigentlich beabsichtigten Zweck. Man kann das aber auch anders formulieren:
Delphi-Quellcode:
Gruss Reinhard
ok := true;
found := ladevar1; if not found then ok := false; found := ladevar2; if not found then ok := false; |
Re: Funktionsaufrufe wegoptimiert???
Eigentlich ist das nicht "Abbruchlogik" sondern Compiler Optimierung.
Was Falsch ist kann bei AND nicht mehr Wahr werden. Somit wird das dann weg gelassen. Aber mit der vorne genannten Schalter kannst du das Compilerverhalten abschalten. |
Re: Funktionsaufrufe wegoptimiert???
Hi,
mit dem Kompilerschalter "boolsche Ausdrücke vollständig" werden auch die anderen Prüfungen mit ausgeführt, wenn das Ergenis schon klar ist. [EDIT] wie auch schon gesagt wurde und ich überlesen habe^^ :) Gruß angos |
Re: Funktionsaufrufe wegoptimiert???
Zitat:
Delphi-Quellcode:
geht auf die Bretter, wenn Blub nil ist
if (Blub <> NIL) and (Blub.TaTa = '') Then
|
Re: Funktionsaufrufe wegoptimiert???
Deshalb sollte man das eigentlich auch so machen (tu ich allerdings auch nicht):
Delphi-Quellcode:
if Blub <> NIL then
if Blub.TaTa = '' Then |
Re: Funktionsaufrufe wegoptimiert???
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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