Autor |
Beitrag |
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 05.05.09 14:33
Hallo liebe Leute,
ich würde gerne bei der Füllung einer Variable eine IF-Abfrage laufen lassen.
Bei PHP geht das ja ganz einfach in der Form:
zinssatz = (if == true) ? dann : sonst;
Bei Delphi funktioniert das allerdings nicht.
zinssatz := (edit3.text = '') ? strtofloat(edit3.text) : 10;
Ich hoffe, ihr versteht mein Problem dabei. Ich will mir die lange IF-Abfrage sparen, sowas ist nervig. Ich hoffe, dass ihr da ne Lösung habt und ich nur einen Syntax-Fehler drin habe.
Vielen Dank schon einmal im Voraus
Gr33tZ
Rn
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 05.05.09 14:36
IIf, ist aber unsauber und sollte man vermeiden, wenn nicht nötig. Zudem solltest Du beachten, dass im Falle von IIf IMMER alle Teile des Ausdrucks ausgewertet werden, was bei PHP nicht der Fall ist.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Di 05.05.09 15:22
Zuletzt bearbeitet von ffgorcky am Di 05.05.09 15:31, insgesamt 1-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 05.05.09 15:30
Letzteres ...
Mit '' verhält es sich wie mit Trinärlogik bei Booleans: '' und String(nil) sind beide leer, aber manche Routinen unterscheiden das ... (die RTL nimmt übrigens meistens String(nil) für Leerstrings  - aber eben halt nicht immer).
Wenn Du auf ungleich prüfst, wird der korrekte Vergleich angestellt.
Für deinen Fall sind aber TryStrToInt bzw. StrToIntDef sinnvoller.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 05.05.09 16:00
BenBE hat folgendes geschrieben : | IIf, ist aber unsauber und sollte man vermeiden, wenn nicht nötig. Zudem solltest Du beachten, dass im Falle von IIf IMMER alle Teile des Ausdrucks ausgewertet werden, was bei PHP nicht der Fall ist. |
was ist IIf?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 05.05.09 16:03
Funktion ab D7, die X := IIf(bool, trueVal, falseVal) diefert ... Halt aanlog dem Trinäroperator von C und PHP, sowie anderer Sprachen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 05.05.09 16:17
Genau das habe ich gesucht.
Aber warum ist das unsauber?
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Di 05.05.09 17:41
Gibt es übrigens auch als IfThen(); 
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 05.05.09 18:12
regsnerven hat folgendes geschrieben : | Aber warum ist das unsauber? |
Hatte ich mehr oder weniger schon angeschnitten:
BenBE hat folgendes geschrieben : | Zudem solltest Du beachten, dass im Falle von IIf IMMER alle Teile des Ausdrucks ausgewertet werden, was bei PHP nicht der Fall ist. |
Heißt konkret:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var X,Y:Integer; Begin Y := 42; X := 0;
X := IIf(X = 0, Y*2, Y div X); end; |
führt zu einer Division durch 0, obwohl bei der ausgeschriebenen Variante dieser Fehler nicht auftreten würde.
Noch schlimmer wird das, wenn man Funktionsrückgabewerte von Funktionen auswertet, die einen Nebeneffekt verursachen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 06.05.09 23:09
Das mit der Nebenfunktion hab ich jetzt nicht verstanden ^^
Also wenn ich das ausgeschrieben hätte, dann wäre dort ein Fehler gekommen oder wie? Weil Division durch 0 geht ja nicht.
Und was ist mit diesem IfThen()? Ist das genau so unsauber?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 07.05.09 08:30
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Regan
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Do 07.05.09 11:54
BenBE hat folgendes geschrieben : | Ne, andersrum: WENN Du diese Funktionen (IIf oder IfThen) nutzt, würde dieser Fehler auftauchen, weil immer alles ausgewertet wird.
Wenn Du das mit einer If-Abfrage schreibst, wird wirklich nur ausgeführt, was benötigt wird. |
Um das mal zu veranschaulichen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var X,Y:Integer; dummy1, dummy2: Integer; Begin Y := 42; X := 0; X := IIf(X = 0, Y*2, Y div X); dummy1 := Y*2; dummy2 := Y div X; if X = 0 then X := dummy1 else X := dummy2; end; |
Das ist vielleicht etwas unrealistisch, aber das Prinzip sollte klar werden  .
|
|
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 07.05.09 16:36
Ganz ehrlich...Delphi macht manchmal so einen Schrott. Anstatt das einfach zu lösen, wie bei PHP. Das wäre doch wohl kein Problem gewesen ~.~
Naja. Danke für eure Hilfe
Gr33tZ
Rn
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Do 07.05.09 20:29
Doch, das wäre ein Problem gewesen. 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 08.05.09 07:59
Diesen Operator gibt es in der Sprachdefinition einfach nicht. Also kann man das nicht ohne Weiteres bauen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 20.05.09 21:13
Irgendwer hat diese Sprache doch erfunden. Hätte dabei doch dran denken können, oder nicht?
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Mi 20.05.09 22:05
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Do 21.05.09 00:04
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Do 21.05.09 08:23
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 21.05.09 09:04
Nicht nur das, durch IfThen ist ja auch eine ähnliche Lösung vorhanden. Die kostet zwar einige Prozessortakte, aber funktioniert ja.
Insgesamt finde ich, dass durch einen Operator oder IfThen die Lesbarkeit teilweise deutlich leidet, das sieht man auch an manchen Javaquelltexten. Auch wenn ich dort den Operator schon öfter mal benutze. Aber nach 3 Jahren oder so drüber stolpere ich beim Lesen etwas, weil es unübersichtlicher ist als es normal zu schreiben.
Dazu kommt der bereits angesprochene Nachteil mit der Geschwindigkeit und möglichen Fehlern ähnlich der vollständigen boolschen Auswertung. Auch dadurch können ja Fehler auftreten, wenn man ein bestimmtes Verhalten voraussetzt ohne explizit das einzustellen.
|
|
|