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 (
PI)
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