AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IfThen Implementation

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

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#1

AW: IfThen Implementation

  Alt 9. Sep 2021, 09: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
44.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: IfThen Implementation

  Alt 9. Sep 2021, 09: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.
Ein Therapeut entspricht 1024 Gigapeut.

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

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

AW: IfThen Implementation

  Alt 9. Sep 2021, 10: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 10:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: IfThen Implementation

  Alt 9. Sep 2021, 10: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.
Ein Therapeut entspricht 1024 Gigapeut.

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

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

AW: IfThen Implementation

  Alt 9. Sep 2021, 10: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
44.388 Beiträge
 
Delphi 12 Athens
 
#6

AW: IfThen Implementation

  Alt 9. Sep 2021, 10: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.
Ein Therapeut entspricht 1024 Gigapeut.

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


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:24 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