Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C++ Code übersetzen (https://www.delphipraxis.net/211828-c-code-uebersetzen.html)

mdadali 8. Nov 2022 13:03

Delphi-Version: 10.4 Sydney

C++ Code übersetzen
 
Hallo,

Ich würde gerne folgende C++ Funktion ins Delphi (Objekt Pascal) übersetzen.
Ich hoffe jemand kann mir helfen.
Danke.

C++ Makros ?
Delphi-Quellcode:
#define GE_PI 3.14159265358979323846    // 180
#define GE_PI2 (GE_PI / 2.0)   // 1,57079632679489661923    90
#define GE_PI4 (GE_PI / 4.0)   // 0,785398163397448309615   45
#define GE_2PI (GE_PI+GE_PI)   // 6,28318530717958647692   360
C++ Funktion:
Delphi-Quellcode:
//-----------------------------------------------
// Angle from point 0,0 to this point (0..2PI)
//-----------------------------------------------
double CGePoint::Angle () const
{
  if (x == 0.0) {
    if (y == 0.0){
      return 0.0;
    }
    return (y>0.0)? GE_PI2 : GE_DEG270;
  }else{
    if (y == 0.0){
      return (x>0.0)? 0.0 : GE_PI;
    }
    if (x > 0.0){
      if (y > 0.0){
        return atan( y / x );
      }else{
        return atan( y / x ) + GE_2PI;
      }
    }else{
      return atan( y / x ) + GE_PI;
    }
  }
}

Klaus01 8. Nov 2022 13:15

AW: C++ Code übersetzen
 
.. dies sind Konstanten
Delphi-Quellcode:
#define GE_PI 3.14159265358979323846 // 180
#define GE_PI2 (GE_PI / 2.0) // 1,57079632679489661923 90
#define GE_PI4 (GE_PI / 4.0) // 0,785398163397448309615 45
#define GE_2PI (GE_PI+GE_PI) // 6,28318530717958647692 360

Code:
 (y>0.0)? GE_PI2 : GE_DEG270;
könnte man am besten mit ifthen oder if then else übersetzen

Grüße
Klaus

mdadali 8. Nov 2022 13:30

AW: C++ Code übersetzen
 
Danke Klaus.
Ich versuche es mal umzuschreiben.
LG. Mustafa.

himitsu 8. Nov 2022 15:17

AW: C++ Code übersetzen
 
Bei bei der Funktion Delphi-Referenz durchsuchenIfThen aufpassen,
denn hier werden immer alle Parameter ausgewertet,
im Gegensatz zum Makro ?:

mdadali 8. Nov 2022 16:11

AW: C++ Code übersetzen
 
Danke himitsu.

Ich habe umgeschrieben und es hat leider nicht funktioniert.
Wie Du erwähnt hast, habe ich Macro :?, warscheinlich fehlerhaft übersetzt.
LG.

himitsu 8. Nov 2022 16:23

AW: C++ Code übersetzen
 
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
Delphi-Quellcode:
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
Delphi-Quellcode:
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

mdadali 8. Nov 2022 22:03

AW: C++ Code übersetzen
 
Danke für Deine Mühe himitsu.

Ich werde Deine Code testen.
LG. Mustafa.

mdadali 8. Nov 2022 22:10

AW: C++ Code übersetzen
 
GE_DEG270 ist

Delphi-Quellcode:
#define GE_DEG270  (GE_PI+GE_PI2)
Danke.

himitsu 9. Nov 2022 00:59

AW: C++ Code übersetzen
 
also doch
Delphi-Quellcode:
PI * 1.5
:lol:

(
Delphi-Quellcode:
PI + (PI / 2)
)

mdadali 9. Nov 2022 10:47

AW: C++ Code übersetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja genau:-D

Dein Prozedur hat tadellos funktioniert.
HackCAD/CAM kann jetzt auch ESSI-Files als input Format verwenden.
Danke für die Unterstützung (besonders himitsu).
LG. Mustafa.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz