Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Übersetzung C -> Delphi: Verkürzte if-Bedingung (https://www.delphipraxis.net/109915-uebersetzung-c-delphi-verkuerzte-if-bedingung.html)

Luckie 10. Mär 2008 09:12


Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Ich habe hier den folgenden kranken C-Code:
Code:
UINT Sum(UINT uNum) {
  return((uNum == 0) ? 0 : (uNum + Sum(uNum - 1)));
}
Wie sieht das in Delphi aus?

thkerkmann 10. Mär 2008 09:17

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Delphi-Quellcode:
function Sum(uNum: Cardinal):Cardinal;
begin
  if uNum=0 then
    result := 0
  else
    result := uNum + Sum(uNum - 1);
end;

Luckie 10. Mär 2008 09:21

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Dank dir. Der Code ist wemfalls lesbar. Und wieder ein Grund mehr, warum mir eine Sprache unsympathisch ist, bei der man so kranken Code schreiben kann. ;)

Dax 10. Mär 2008 09:22

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Zitat:

Zitat von Luckie
Ich habe hier den folgenden kranken C-Code

Wieso krank? Das sieht noch fast(!) schön aus für C ;)

DeddyH 10. Mär 2008 09:22

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Das ist der sog. ternäre Operator, den gibt es in Java oder PHP auch ;)

Medium 10. Mär 2008 09:24

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Die Funktion lässt sich durch eine Formel weit eleganter und schneller abbilden: Herrn Gauß sei Dank

Luckie 10. Mär 2008 09:36

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
@Medium: Ich weiß, aber damit bekomme ich keinen Stacküberlauf hin, aber genau den brauche ich. ;)

jottkaerr 10. Mär 2008 10:05

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Dann nimm doch ein Argument, dass groß genug ist:

Delphi-Quellcode:
program tso;

{$APPTYPE CONSOLE}
{$R-}

uses
  Classes;

function Sum(const Num: Cardinal): Cardinal;
begin
  if Num = 0 then
    Result := 0
  else
    Result := Num + Sum(Num - 1);
end;

begin
  Writeln(Sum(MaxInt));
end.
jkr

Luckie 10. Mär 2008 10:09

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Genau das tue ich ja auch. Wenn ich aber den Gauss-Algorithmus benutze, dann bekomme ich keinen StackOverflow, sondern ein Integer-Overflow. ;)

jottkaerr 10. Mär 2008 10:15

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Wofür brauchst Du einen Stack Overflow? (Klar, dass Du ihn mit einer nicht-rekursiven Funktion nur schwerlich erzeugen kannst.)

Den Integer-Überlauf könntest Du mit {$Q-} verhindern. Fälschlicherweise hatte ich im Beispiel {$R-} verwendet.

jkr

Luckie 10. Mär 2008 10:36

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Hehe. Neugierig ist er ja. Sei unbesorgt, ich weiß, was ich tue. ;)

Medium 10. Mär 2008 10:44

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Einen Code als krank bezeichnen, aber nen StackOverflow provozieren, das sind mir die besten ;)

Luckie 10. Mär 2008 11:01

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Zitat:

Zitat von Medium
Einen Code als krank bezeichnen, aber nen StackOverflow provozieren, das sind mir die besten ;)

Es ist zu Demonstrationszwecken.

SirThornberry 10. Mär 2008 11:15

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Delphi-Quellcode:
function Sum(Cardinal uNum): Cardinal;
begin
  result := IfThen(uNum = 0, 0, uNum + Sum(uNum - 1));
end;
du siehst in Delphi sieht es auch nicht besser aus wenn man dort die verkürzte Version nimmt (math in den uses vorrausgesetzt)

Luckie 10. Mär 2008 11:22

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Zitat:

Zitat von SirThornberry
Delphi-Quellcode:
function Sum(Cardinal uNum): Cardinal;
begin
  result := IfThen(uNum = 0, 0, uNum + Sum(uNum - 1));
end;
du siehst in Delphi sieht es auch nicht besser aus wenn man dort die verkürzte Version nimmt (math in den uses vorrausgesetzt)

Geht aber erst ab BDS2006 oder? Und Gott sei dank, scheint sich das noch nicht durchgesetzt zu haben bei den Delphi-Programmierern.

Hawkeye219 10. Mär 2008 11:24

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Hallo,
Zitat:

Zitat von SirThornberry
du siehst in Delphi sieht es auch nicht besser aus wenn man dort die verkürzte Version nimmt (math in den uses vorrausgesetzt)

IfThen darf hier auch gar nicht eingesetzt werden, weil in jedem Fall die Ausdrücke für False und True ausgewertet werden.

Gruß Hawkeye

Muetze1 10. Mär 2008 23:26

Re: Übersetzung C -> Delphi: Verkürzte if-Bedingung
 
Zitat:

Zitat von Luckie
Geht aber erst ab BDS2006 oder? Und Gott sei dank, scheint sich das noch nicht durchgesetzt zu haben bei den Delphi-Programmierern.

Sorry, aber die gib's schon ab Delphi 7 (wahrscheinlich Delphi 6)...

Delphi 7 Hilfe
Die Funktion gibt abhängig von einer Bedingung einen von zwei angegebenen Werten zurück.

Unit

Math oder StrUtils

Kategorie

Sonstige Routinen

Delphi-Syntax:

function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer = 0): Integer; overload;

function IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64 = 0): Int64; overload;
function IfThen(AValue: Boolean; const ATrue: Double; const AFalse: Double = 0.0): Double; overload;
function IfThen(AValue: Boolean; const ATrue: string; const AFalse: string = ''): string; overload;

C++ Syntax:

extern PACKAGE int __fastcall IfThen(bool AValue, const int ATrue const int AFalse);
extern PACKAGE __int64 __fastcall IfThen(bool AValue, const __int64 ATrue const __int64 AFalse);
extern PACKAGE double __fastcall IfThen(bool AValue, const double ATrue const double AFalse);
extern PACKAGE AnsiString __fastcall IfThen(bool AValue, const AnsiString ATrue const AnsiString AFalse);

Beschreibung

IfThen überprüft den in AValue übergebenen Ausdruck und gibt AValue zurück, wenn die Auswertung true ergab. Ist die Auswertung false wird AFalse zurückgegeben. Wenn der Parameter AFalse weggelassen wird, gibt IfThen in Delphi 0 oder einen leeren String zurück, wenn die Auswertung von AValue False liefert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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