AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

IfThen Implementation

Ein Thema von darktrym · begonnen am 9. Sep 2021 · letzter Beitrag vom 9. Sep 2021
Antwort Antwort
darktrym

Registriert seit: 17. Jun 2020
11 Beiträge
 
Delphi 5 Professional
 
#1

IfThen Implementation

  Alt 9. Sep 2021, 10:23
Delphi-Version: 10.2 Tokyo
Hallo,
ich frage mal nach weil ich nix dazu in der Hilfe finden kann, ist das Verhalten von IfThen auch in höheren kaputt?
Ich meine damit wenn die Argumente 2 oder 3 eine Dereferenzierung eines Objekts verwenden und Argument 1 prüft ob das möglich ist.
Delphi führt dann auch den Zweig aus, der nicht wahr ist was zu einer Zugriffsverletzung führt.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#2

AW: IfThen Implementation

  Alt 9. Sep 2021, 10:29
IfThen ist eine Function. Da werden die Parameter vor dem Aufruf ausgewertet und dann an die Function übergeben. Folglich müssen alle Parameter für IfThen auch fehlerfrei ausgewertet können.

Das hat auch nichts mit der Implementierung zu tun, sondern mit der Art und Weise wie Functions in Delphi/Pascal aufgerufen werden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: IfThen Implementation

  Alt 9. Sep 2021, 10:38
Das ist einer der Gründe weshalb ich die Verwendung von IfThen in den meisten Fällen nicht empfehle:
Es ist ein unnötiger zusätzlicher Aufruf an eine Funktion mit einem unnötigen Aufruf für einen der Parameter und stopft mehrere Befehle unnötigerweise in eine Zeile, was der Übersicht abträglich ist.

Deshalb ist es meistens sinnvoller wirklich ganz normal mit if..then zu arbeiten.

Ausnahme ist so etwas:
Delphi-Quellcode:
Left := 250 * DPIFactor + IfThen(Screen.Width > 1080, 200, 100);
// feste Werte in beiden Fällen und Teil eines komplexeren Ausdrucks
Da kann es übersichtlicher sein, wenn man die Berechnung nicht dupliziert und auch das Ergebnis des IfThen nicht vorher zwischenspeichert.

Ich persönlich nutze es aber auch da nicht.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: IfThen Implementation

  Alt 9. Sep 2021, 10:45
Eigentlich ist IfThen() nur sinnvoll einzusetzen, wenn die beiden möglichen Rückgabewerte Konstanten oder konstante Ausdrücke sind.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#5

AW: IfThen Implementation

  Alt 9. Sep 2021, 10:53
In C-Spachen ist IfThen bzw ?: ein Makro, was die Parameter, bzw. die übergebenen Codes, erst auswertet, wenn "wirklich" drauf zugegriffen wird, also bei TRUE nur das vom True-Parameter.

In Delphi ist es (leider) eine stinknormale Funkltion, bei der auch das Inline nicht dabei hilft den "unnötogen" Parameter nicht vorher aufzulösen,
also alles was als Parameter rein geht, wird vorhr ausgeführt/aufgelöst und nur die Ergebnisse (die Werte an die Parameter) werden anschließend entsprechend zurückgegeben (oder nicht).



Selbst von der Pascal/Delphi-Syntax her, ohne Inkompatibilitität zur bestehenden Syntax, wäre es möglich "einfache" Makros auch ins Delphi zu bekommen, aber der Hersteller weigert sich vehement, was sehr schade ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Sep 2021 um 10:57 Uhr)
  Mit Zitat antworten Zitat
darktrym

Registriert seit: 17. Jun 2020
11 Beiträge
 
Delphi 5 Professional
 
#6

AW: IfThen Implementation

  Alt 9. Sep 2021, 11:10
Die Dereferenzierung wird zur Laufzeit gemacht, daher ist die Auswertung aller Zweige zur Laufzeit nicht notwendig.
Der ternäre Operator in C-artigen Sprachen macht das meines Wissens auch nicht.
Üblicherweise verwendet ich das in Logs als Logger.Log(Format('barcode:%s', IfThen(Assigned(entry), entry^.bc, ''))) aber das erzeugt Zugriffsverletzungen weil der Compiler das nicht prüft aber kaputten Code zur Laufzeit erzeugt. Also mehr als nur unschön weil man sowas eher zufällig mitbekommt.

Geändert von darktrym ( 9. Sep 2021 um 11:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#7

AW: IfThen Implementation

  Alt 9. Sep 2021, 11:13
Bei beiden wird der Code im Compiler erzeugt (zur Laufzeit ändert sich nichts mehr),
aber bei dem C-Makro wird der "Code" innerhalb des Makros ausgewertet (hier kann dann der ungenutzte Teil/Parameter übersprungen werden),
und in Delphi eben schon alle Parameter vor Aufruf der Funktion.

Auch in C würde es knallen, wenn IfThen dort als Funktion implementiert wäre.


Einzig was (aktuell) ginge, wären z.B. den Parameter-Code Funktionen/Methoden/AnonymeMethoden auszulagern und diese im IfThen auszuwählen,
weil zwar die Methoden-Zeiger vorher aufgelöst werden, aber der Methoden-Inhalt erst dann ausgeführt würde, wenn ausgewählt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Sep 2021 um 11:18 Uhr)
  Mit Zitat antworten Zitat
darktrym

Registriert seit: 17. Jun 2020
11 Beiträge
 
Delphi 5 Professional
 
#8

AW: IfThen Implementation

  Alt 9. Sep 2021, 11:21
Delphi-Quellcode:
function IfThen(pCondition: Boolean; const pBranchTrue, pBranchFalse: String): String;
begin
  if pCondition then
    Result:= pBranchTrue
  else
    Result:= pBranchFalse;
end;
Hat diese Implementation dieses Problem auch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#9

AW: IfThen Implementation

  Alt 9. Sep 2021, 11:30
ja,

aber so lange man nur ein Varialen oder Konstanten übergibt und nichts bei Übergabe zusammensetzt/aufruft, stört es nicht.


Das IfThen aus der StrUtils sieht praktisch genauso aus, außer daß es noch als INLINE deklariert ist,
was aber nur beeinflußt ob die Funktion direkt aufgerufen wird, oder der IFCode an Stelle des Aufrufers steht.

Wenn makromäßig bei Inline die Parameter an den Stellen im code eingefügt und das dann kompiliert würde, dann würde es gehen, aber hier wird erst aufgelöst und dann nur das Result also der Parameter (die Temp-Variable) an den Stellen genutzt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Sep 2021 um 11:33 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 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