Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mo 03.02.03 16:48 
Hi,

es gibt ja in einigen anderen Programmiersprachen (C, PHP etc) eine verkürzte Form von If-Then-Else...

in etwa so:
ausblenden Quelltext
1:
Statement1:Statement2?Statement3;					

das entspricht demselebn wie dashier:
ausblenden Quelltext
1:
If Statement1 then Statement2 else Statement3;					


weiß jemand ob's das in Delphi auchgibt??

Au'revoir,
Aya~

PS: Hab grad nen "Bug" im Forum gefunden... *g* markiert mal irgendwo hier auf der Seite (Thema Schreiben) nen paar buchstaben, und dann klickt auf z.B. "Code"... *gg*

_________________
Aya
I aim for my endless dreams and I know they will come true!
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mo 03.02.03 16:55 
Hi,

soweit ich weiß nicht. Wieso denn? if-then-else ist doch auch nicht sooo lang :wink:

AXMD
Tower
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Mo 03.02.03 17:11 
In Grenzen kann man das "simulieren":

ausblenden Quelltext
1:
2:
3:
  [...]
  i := IfThen(a > b, 1, 2);
  [...]


steht für

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
  [...]
  if a>b then
    i:=1
  else
    i:=2;
  [...]


Einfach mal in der Hilfe nach "IfThen" gucken...
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 03.02.03 18:36 
IfThen: Den kannte ich auch noch nicht. Finde ich aber genauso unübersichtlich wie den Konditionaloperator (so heißt das Vieh glaube ich).

In Java sind Doppelpunkt und Fragezeichen übrigens vertauscht.

Den Bug finde ich witzig. :lol:

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Mo 03.02.03 18:59 
Häh wo solln da ein Bug sein??? :oops: :?: :?:

Fiji-Fighter
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 03.02.03 19:03 
Markiere im Fenster "Antwort schreiben" mal z.B. etwas im Text "Nachrichtentext" und klicke dann auf "Code".

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Mo 03.02.03 19:16 
Was habt ihr denn für Browser??
bei mir klappts nicht bzw. find ich da jedenfalls nichts lustig:
ich habe
Zitat:
nachrichtentext

markiere es, klicke auf "Code" und danach steht das da:
Zitat:
["code"]nachrichtentext[/code]


"code" ist natürlcih normal nicht in " " " ;)

ist doch alles normal oder nicht?? :roll:

Fiji-Fighter
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 03.02.03 19:24 
Ich bin mir nicht ganz sicher, ob wir vom selben reden. Du kannst das ganze auch mit dem blau unterlegten Titel "Antwort schreiben" machen. Es ist ganz einfach nur witzig, dass man Code-Tags auch außerhalb der Memobox setzen kann, sondern in jeden Text auf der Seite. Selbst auf die Angabe für die Zeitverschiebung.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Mo 03.02.03 19:31 
*LOl* :rofl:
:autsch: Stand (mal wieder) auf der Leitung :oops:

Ist ja echt cool...

habe gerade mein Memo verschwinden lassen irgendwie...

Danke für die Erklärung...

:angel: sorry admins & Mods, weil das ja eigentlich offtopic wäre...
aber dafür nen extra thread wär auch net das wahre oder??? :angel:

Fiji-Fighter
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Di 04.02.03 05:11 
Hallo!

Nachdem sich einige über den Bug aufgeregt haben (tatsächlich gut :mrgreen:), nun noch was konstruktives.

Der IfThen-Befehl enthält eine böse Falle!
ausblenden Quelltext
1:
2:
3:
if bedingung then
  wert := funktion1 else
  wert := funktion2;

Wenn "bedingung" erfüllt ist, wird "funktion1" ausgeführt und "wert" erhält deren Ergebnis, wenn "bedingung" nicht erfüllt ist, wird "funktion2" ausgeführt und "wert" erhält deren Ergebnis. Das bedeutet, es wird nur eine der beiden Funktionen ausgeführt.
Anders bei
ausblenden Quelltext
1:
wert := IfThen(bedingung, funktion1, funktion2);					

Hierbei werden beide Funktionen ausgeführt, um die Werte für IfThen zu berechnen, dann wird je nach Ergebnis von "bedingung" einer der Werte benutzt und an "wert" übergeben. Kann unerwünschte Nebeneffekte haben!

Irgendwo fand ich mal die Frage:
ausblenden Quelltext
1:
2:
3:
4:
function fact(n: integer): integer;
begin
  result := IfThen (n>1, 1, fact(n-1));
end;

führe zum Stacküberlauf - logisch, weil ja die Rekursion ja immer aufgerufen wird und der Speicher nicht unendlich ist.

Da hätte ich auch noch einen:
ausblenden Quelltext
1:
zeichen := IfThen(length(satz)<5, #0, satz[5]);					

fällt bei AnsiString (normale Strings) garantiert auf die Nase!

Oder, um mal einen Werbespruch zu erfinden:
IfThen - die neue Möglichkeit, unübersichtlich zu programmieren!

Nebenbei: in SIMULA kann man schreiben:
ausblenden Quelltext
1:
wert := if bedingung then 1 else 2;					

SIMULA 67 wurde übrigens am Norwegian Computing Center in Olso für Simulationsprobleme aus ALGOL 60 entwickelt und war wohl die erste objektorientierte Sprache - wie der Name sagt von 1967!

Gruß

Dietmar Brüggendiek
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 04.02.03 07:30 
Wer solch ein Konstrukt benutz, der kann seine Anwendung selber debuggen. "Ohne mich", sage ich da. :evil:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 04.02.03 09:34 
Aya hat folgendes geschrieben:
es gibt ja in einigen anderen Programmiersprachen (C, PHP etc) eine verkürzte Form von If-Then-Else... weiß jemand ob's das in Delphi auchgibt??

Genau so? Nein. Aber Hagen Reddmann aus dem Entwickler-Forum brachte mich auf eine Alternative, die ich seit einiger Zeit z.B. für sich ändernde Menütexte usw. nutze.

Dazu verpackt man die gewünschten Daten (ob nun Text o.ä.) in ein Bool-Array
ausblenden Quelltext
1:
2:
3:
4:
5:
const
  cStatementArray : array[boolean]of cardinal =
    (0,MF_GRAYED);
  cTextArray : array[boolean]of string =
    ('aus','an');

z.B., wobei es -wie man sehen kann!- auf den Typ ankommt. Das ganze lässt sich nun ohne if-then-Klausel im Quellcode nutzen:
ausblenden Quelltext
1:
2:
AppendMenu(hm,MF_STRING or cStatementArray[fEnable],
  IDC_MENUITEM1,cTextArray[fOn]);

Normalerweise hätte ich zwei if-then-Klauseln schreiben müssen. Eine, bei der geprüft wird ob der Menüeintrag normal oder deaktiviert dargestellt werden soll. Und noch mal eine für den Menütext selbst, der sich ja auch ändern kann.

Also, ich denke, das kürzt ganz schön. Und übersichtlich und leicht verständlich dürfte es trotzdem noch sein. :) Oder?
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 04.02.03 14:10 
:roll: wo wir grad beim thema sind:

ich schreib gern
ausblenden Quelltext
1:
2:
3:
4:
case a>b of
  true : doBla();
  false: doGna();
end;


was ist schneller if oder case oder beides? :lol: bzw spricht irgenwas gegen case oder is es nur geschmacksache?

mfg mx
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 04.02.03 15:07 
case ist hilfreich, wenn eine Variable mehr als zwei Werte annehmen kann. Dann ersparst du dir auf jeden Fall eine Menge verschachtelter if-Anweisungen.
Gegen deine Methode spricht also nichts; im Prinzip nutzt jeder das, was ihm am besten gefällt und womit er die wenigsten Schwierigkeiten hat.

btw: Diese IfThen-Anweisung, die Tower ansprach, gibt´s wohl erst in neueren Delphi-Versionen? In D5 existiert sie offenbar noch nicht. :? Aber macht ja nichts, ´s gibt ja Alternativen.
Tower
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Di 04.02.03 15:19 
Echt? Hmmm... könnte schwören, ich hab die auch schon unter D5-Projekten benutzt...
Nagut, vielleicht vertu' ich mich da aber auch... ;)

Allerdings hat maximus eine interessante Frage aufgeworfen, finde ich: Dass sich Case- und If-Anweisungen optisch unterscheiden, ist ja klar, aber: Tun die sich performance-mäßig auch nichts?

Ist nach der Kompilierung

ausblenden Quelltext
1:
2:
3:
4:
5:
case a of
  1: ...
  2: ...
  3: ...
end;


dasselbe wie

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
if a=1 then
  ...
else if a=2 then
 ...
else if a=3 then
  ...


?
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 04.02.03 15:31 
Peter Lustig hat folgendes geschrieben:
In Java sind Doppelpunkt und Fragezeichen übrigens vertauscht.

In C und JavaScript auch. Ich denke, Aya hat sich schlicht vertan. Korrekt dürfte in jedem Fall das sein:
ausblenden Quelltext
1:
Condition?Statement1(true):Statement2(false)					


@Tower: Ich halte case für effizienter, aber das ist nur "subjektiv gefühlt". Ob´s der Wahrheit entspricht und tatsächlich schneller ist? Hm ...
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 04.02.03 15:49 
:arrow: um meine eigene frage mal zu beantworten:

IF gewinnt mit 5339683 time units gegenüber case mit 11392357 time units!

hab beide 1Mrd. mal laufen lassen und siehe da IF ist doppelt so schnell :D schade eigentlich! Aber für den normalen gebrauch ist das wohl irrelevant.

mfg mx
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Di 04.02.03 15:53 
hi,

ich denke mal im Compiler sähe das so aus:

Beim IF:

ausblenden Quelltext
1:
2:
3:
4:
If A=1 then
  //...
else
  /...


Beim Case:
ausblenden Quelltext
1:
2:
3:
4:
If A=1 then
  //...
If A=2 then
  //...


Das würde die doppelte geschwindigkeit erklären.. :)

_________________
Aya
I aim for my endless dreams and I know they will come true!
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 04.02.03 15:56 
allerdings würde er 'A=1' nur einmal ausrechnen:
ausblenden Quelltext
1:
2:
3:
res := A=1;
if res = true then...break;
if res = false then...;

möglicherweise

Moderiert von user profile iconTino: Code-Tags hinzugefügt.