Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: C++ Code übersetzen

  Alt 8. Nov 2022, 16:23
Leider weigert sich der Hersteller krankhaft zwanghaft einfache/kurze Makros im Pascal zu implementieren und den Preprozessor haben sie auch vor Jahrzehnten kaputt gemacht,
sonst hätten wir jetzt viele Probleme nicht, bei derartigen Headerübersetzungen.


Delphi-Quellcode:
#define GE_PI 3.14159265358979323846
#define GE_PI2 (GE_PI / 2.0)
#define GE_PI4 (GE_PI / 4.0)
#define GE_2PI (GE_PI+GE_PI)

(y>0.0)? GE_PI2 : GE_DEG270;
und nun einfach nach und nach alles ersetzen/tauschen

also
Result := (y > 0.0) ? GE_PI2 : GE_DEG270;
zu
Delphi-Quellcode:
Result := IfThen(y > 0.0, GE_PI2, GE_DEG270);

// oder

if y > 0.0 then
  Result := GE_PI2
else
  Result := GE_DEG270;
GE_DEG270?

Delphi-Quellcode:
if y > 0.0 then
  Result := (GE_PI / 2.0)
else
  Result := GE_DEG270;
Delphi-Quellcode:
if y > 0.0 then
  Result := (GE_PI / 2.0)
else
  Result := GE_DEG270;
Delphi-Quellcode:
if y > 0.0 then
  Result := (3.14159265358979323846 / 2.0)
else
  Result := GE_DEG270;
wobei GE_PI brauchen wir nicht, weil haben wir schon selber was (Delphi-Referenz durchsuchenPI)
Delphi-Quellcode:
if y > 0.0 then
  Result := PI / 2.0
else
  Result := GE_DEG270;

// oder eben

Result := IfThen(y > 0.0, PI / 2.0, GE_DEG270);
Da Y nicht direkt im Result verwendet wird und alles Konstanten zu sein schienen, ist gegen IfThen kaum was Einzuwenden.
z.B. bei IfThen(Y <> 0, irgendwas / Y, 0) würde es knallen, weil "durch Y" immer berechnet wird, selbst wenn Y 0 ist und Division durch 0 ... nja ... Schulwissen. (beim ?-Makro in C++ ginge sowas aber)

Code:
GE_PI   =  PI
GE_PI2  =  PI/2
GE_PI4  =  PI/4
GE_2PI  =  PI*2

Delphi-Quellcode:
  if x = 0 then begin
    if y = 0 then
      Exit(0);
    Exit(IfThen(y > 0, PI/2, GE_DEG270));
  end else
    if y = 0 then
      ...
OK, ich mach mal mit ein paar zusätzlichen ELSE und Result statt Exit weiter.
Delphi-Quellcode:
  if x = 0 then
    if y = 0 then
      Result := 0
    else
      if y > 0 then //Result := IfThen(y > 0, PI/2, GE_DEG270)
        Result := PI/2
      else
        Result := GE_DEG270 // DEG270 = PI*1.5 ???
  else
    if y = 0 then
      if x > 0 then //Result := IfThen(x > 0, 0, PI)
        Result := 0
      else
        Result := PI
    else
      if x > 0 then
        if y > 0 then
          Result := atan(y / x)
        else
          Result := atan(y / x) + PI*2
      else
        Result := atan(y / x) + PI;
Sollten die Werte nicht "ganz" genau stimmen,
dann liegt es vielleicht noch an falschen Typen
und Rundungsproblemen.
-> Single, Double, Extended
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Nov 2022 um 16:43 Uhr)
  Mit Zitat antworten Zitat