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:
|
Re: Funktionsaufrufe wegoptimiert???
Hast du Einfluß auf die Funktion FindEntry?
Delphi-Quellcode:
Fehler := false;
a := FindEntry(F, 'A=', Fehler); b := FindEntry(F, 'B=', Fehler); c := FindEntry(F, 'C=', Fehler); ...
Delphi-Quellcode:
function FindEntry(...
begin ... if was_ist_falsch then Fehler := True; ... end; |
Re: Funktionsaufrufe wegoptimiert???
Zitat:
|
Re: Funktionsaufrufe wegoptimiert???
Ok danke, habs verstanden.
Die einfachste Lösung für mein Problem ist somit
Delphi-Quellcode:
So muss ich am wenigsten tippen. Es handelt sich nämlich nicht nur um 3 Ausdrücke sondern um ca. 100.
var a,b,c...: integer;
ok:=true {$B+} ok:=ok and FindEntry(F, 'A=', a); ok:=ok and FindEntry(F, 'B=', b); ok:=ok and FindEntry(F, 'C=', c); {$B-} Ich liebe Compilerschalter :-) |
Re: Funktionsaufrufe wegoptimiert???
Zitat:
|
Re: Funktionsaufrufe wegoptimiert???
Zitat:
|
Re: Funktionsaufrufe wegoptimiert???
Zitat:
Hast du mal etwas von einer For-Schleife gehört? Oder einem Konstanten-Array?
Delphi-Quellcode:
const
LISTE: array[0..99] of string = ( 'A=', 'B=', .... ); ... for i := Low(LISTE) to High(LISTE) do begin erg := FindEntry(F, LISTE[i], wert[i]); ok := ok and erg; end; |
Re: Funktionsaufrufe wegoptimiert???
Zitat:
Warum mit Compilerschaltern anstelle es gleich so zu formulieren wie du willst (also wie in Beitrag 2 beschreiben) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr. |
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