Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Wie behandelt der compiler If-Statements?
BeniSchindler - Mo 28.03.11 21:48
Titel: Wie behandelt der compiler If-Statements?
Ich habe folgendes Problem:
Ich benutze Woll2Woll komponenten um DB-Grids anzuzeigen.
Es hat bisher immer alles wunderbar funktioniert.
Nun gibt der compiler auf einmal Access Violations aus, wenn ich diese Komponenten verwenden will.
Wenn ich die Stelle begutachte wo er aussteigt, muss ich auch sagen, dass ich diese auch fehlerhaft programmiert finde.
Sie schreiben folgende Art von if-Statements:
Delphi-Quelltext
1: 2:
| if aObject <> nil and aObject.parent is TForm then do something; |
Nun ist es für mein Verständnis jedoch normal, dass das Programm austeigen muss, wenn aObject = nil ist.
Oder sehe ich da etwas falsch? Oder kann man dem Compiler irgendwo sagen, dass er den zweiten if-Part nicht prüft, wenn der erste nicht true ist.
ich selber dachte bisher immer man müsste es fogender masen programmieren:
Delphi-Quelltext
1: 2: 3:
| if aObject <> nil then if aObject.parent is TForm then do something; |
Haben die Fehlerhaft programmiert? Oder habe ich ausversehen etwas falsch im compiler eingestellt.
Aber warum hat es dann bisher immer funktioniert?
F34r0fTh3D4rk - Mo 28.03.11 21:50
Funktioniert denn die zweite Variante überhaupt? Aber normalerweise müsste er schon bei der linken Hälfte der if-Abfrage aufhören, wenn diese false ergibt. Mal Klammern probiert?
Delphi-Quelltext
1:
| if (aObject <> nil) and (aObject.parent is TForm) then |
FinnO - Mo 28.03.11 22:06
soweit ich weiß, wird bei AND immer erstmal nur das erste statement geprüft - Allerdings habe ich keine Ahnung ;) Klammern sind trotzdem nötig.
jaenicke - Mo 28.03.11 22:13
Die entsprechende Compilereinstellung nennt sich vollständige boolesche Auswertung. Wenn {$BOOLEVAL OFF} gesetzt ist (Standardeinstellung), wird ein boolescher Ausdruck nur so weit analysiert bis das Ergebnis feststeht.
Wenn die Direktive gesetzt ist, wird alles ausgewertet. Deshalb ist es sehr wichtig diese Direktive selbst direkt vor dem betroffenen Code ein-/auszuschalten, wenn man sich darauf verlässt, dass sie entsprechend gesetzt ist...
BeniSchindler - Di 29.03.11 15:26
@jaenicke: Vielen Dank! Das war genau die Einstellung die ich gesucht habe.
Nachdem ich vor alle kritischen Abschnitte von der gekauften Komponente {$BOOLEVAL OFF} geschrieben habe, funktoiniert sie wieder einwand frei. Was jedoch komisch ist, ich muss es tatsächlich bei allen Abschnitten wieder neu davor schreiben.
Einmal am anfang des Projekts reicht komischer weise nicht.
Mein Compiler scheint irgendwo her auf einmal immer {$BOOLEVAL ON} zu bekommen, und ich weiss nicht wieso.
Das war bis vorgestern nicht so.
Egal, auf jeden Fall habe ich wieder ein funktionierendes Programm.
So kann man auch nach 15Jahren programmieren noch etwas über so einfache sachen wie IF-Abfragen lernen :)
@alle:
Wegen der Klammern - Stimmt, da habe ich beim beispiel Code schreiben nicht aufgepasst :)
Und die zweite Variante ist die, wie man es programmieren müsste wenn {$BOOLEVAL ON} ist, damit keine Zugriffsverletzungen auftreten. ... Und wieso sollte sie nicht funktionieren?
Wobei ich auch da schlampigen Beispielcode geschrieben habe. "do something" sollte nicht die Delphi direktive "do" sein sondern für einen beliebigen Prozeduraufruf stehen. :)
Euch allen einen schönen Tag und nochmal vielen Dank!
Beni
jaenicke - Di 29.03.11 15:52
BeniSchindler hat folgendes geschrieben : |
| Mein Compiler scheint irgendwo her auf einmal immer {$BOOLEVAL ON} zu bekommen, und ich weiss nicht wieso. |
Vielleicht aus den Projektoptionen (Verzeichnisse/Bedingungen --> Definition, bzw. bei neueren Delphiversionen: Delphi-Compiler --> Bedingungen)? Oder direkt unter Compiler die Option? ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!