Seite 1 von 1
Wie übersetzt mal solchen C++ code?
Verfasst: Sonntag 12. Oktober 2008, 14:34
von fusion44
Hi,
dank meiner eingrschränkten C++ Fähigkeiten hab ich Probleme mit dem übersetzen von diesem code:
Code: Alles auswählen
const ColourValue &horAxisColor = Math::RealEqual(camRightX, 1.0f) ? ColourValue::Red
: Math::RealEqual(camRightY, 1.0f) ? ColourValue::Green
: Math::RealEqual(camRightZ, 1.0f) ? ColourValue::Blue : m_colour1;
Die Namespace, Punkte usw sind nicht das Problem. Aber wie werden die ? und : operatoren ausgewertet? Soweit ich das mitbekommen habe nach einer mehr oder weniger erfolglosen google suche gibts solche conditionals in Python ja nicht und müsste das entsprechend mit if/else statements machen. Aber wo fang ich da an?
Ich danke schonmal im voraus!
fusion44
Verfasst: Sonntag 12. Oktober 2008, 14:40
von sma
Code: Alles auswählen
hor_axis_color = RED if x == 1 else GREEN if y == 1 else BLUE if z == 1 else color1
Das könnte aber bei den eigentlich längeren Variablen- und Konstantennamen besser als Folge von IF-Anweisungen aussehen.
Stefan
Verfasst: Sonntag 12. Oktober 2008, 15:05
von snafu
sma hat geschrieben:Das könnte aber bei den eigentlich längeren Variablen- und Konstantennamen besser als Folge von IF-Anweisungen aussehen.
Das finde ich schon jetzt relativ unleserlich.
Verfasst: Sonntag 12. Oktober 2008, 16:56
von fusion44
huhu
Ich hab das jetzt so gemacht:
Code: Alles auswählen
if og.Math.RealEqual(camUpX, 1.0):
horAxisColor = og.ColourValue.Red
elif og.Math.RealEqual(camUpY, 1.0):
horAxisColor = og.ColourValue.Green
elif og.Math.RealEqual(camUpZ, 1.0):
horAxisColor = og.ColourValue.Blue
else:
horAxisColor = self.m_colour1
Sieht meiner Meinung nach besser aus und ist um einiges leserlicher.
Das nächste wäre das:
Code: Alles auswählen
int multX = (x == 0) ? x : (x < 0) ? (int) (x / mult - 0.5f) : (int) (x / mult + 0.5f);
Hab ich übersetzt mit:
Code: Alles auswählen
if x == 0:
multX = x
elif x < 0:
multX = int(x / mult - 0.5)
else:
multX = int(x / mult + 0.5)
Wenn das jetzt stimmt dann glaube ich hab ich das Prinzip verstanden.

Verfasst: Sonntag 12. Oktober 2008, 17:24
von Y0Gi
Das Konstrukt ``<Bedingung> ? <Wert wenn wahr> : <Wert wenn falsch>`` nennt sich ternärer Operator. Der ist an sich schon nicht der Lesbarkeit letzter Schluss, aber die Verkettung in obigem Beispiel ist ja von übelster Sorte.
Verfasst: Sonntag 12. Oktober 2008, 17:34
von BlackJack
@fusion44: Was heisst in diesem Kontext eigentlich "übersetzen"? Das sieht sehr danach aus, als wenn Du versuchst C++ 1:1 in Python-Syntax zu schreiben. Wozu soll das gut sein? Schreib doch bitte Python mit Python-Syntax. Es gibt zum Beispiel Sachen, die einfach keinen Sinn machen, wie der 'm_'-Präfix. Den braucht man bei C++ um Member-Variablen initialisieren zu können, um Kollisionen zwischen Argumentnamen und Membernamen zu vermeiden. Das Problem gibt's bei Python nicht also ist auch die "Lösung" völlig überflüssig. Und dan gäb's da noch den Python Style Guide, der eine andere Schreibweise von Namen nahelegt.
Man könnte das auch mit einer Schleife ausdrücken:
Code: Alles auswählen
hor_axis_color = self.color_1
for cam_axis, color in ((cam_up_x, RED),
(cam_up_y, GREEN),
(cam_up_z, BLUE)):
if real_equal(cam_axis, 1):
hor_axis_color = color
break
Dein zweites Beispiel kann man ganz ohne Fallunterscheidung so schreiben:
@Y0Gi: Das erste Beispiel ist IMHO lesbar so wie es formatiert ist. Versuchs mal als ``switch``/``case`` zu sehen wo bei jedem ``case`` ein Ausdruck ausgewertet wird, statt nur einmal beim ``switch``. Also quasi die "guard"-Syntax bei Haskell oder `cond` bei Scheme.
Verfasst: Sonntag 12. Oktober 2008, 17:37
von Y0Gi
BlackJack: Ich für meine Teil würde natürlich so lange das Verhalten des Codes ändern, bis man ihn ordentlich formatieren kann

Dann haben die Achsen eben die selbe Farbe, dann schreibt man halt den Namen dran
Und überhaupt, wenn man schon C mit ++ nutzt, könnte man auch Achsenobjekte machen und denen 'ne Farbe zuweisen.
Verfasst: Sonntag 12. Oktober 2008, 20:03
von fusion44
Ich wollte den Code erstmal zum laufen bringen und dann Pythonifizieren. Ich hab mit PyQt angefangen und da is die Schreibweise für eine Variable eher self.myVariableName anstatt self.my_variable_name. Mir gefällt da die erste Variante am besten.
In dem Fall macht es auch keinen Sinn für jede Achse eine eigene Klasse zu erstellen. Wer will kann sich die komplette Klasse mal anschauen:
http://www.ogre3d.org/wiki/index.php/EditorGridSystem
Verfasst: Sonntag 12. Oktober 2008, 22:10
von BlackJack
PyQt ist aber kein Python, sondern eine Anbindung an ein C++-GUI-Toolkit. Das die die C++-Namensgebung übernehmen ist pragmatisch weil die Wrapper zum Grossteil automatisch generiert werden.
So etwas wie die 'm_'s kann man trotzdem gleich beseitigen. Das wird ja sozusagen durch das 'self.' ersetzt. Beides zu schreiben ist redundant.
Verfasst: Montag 13. Oktober 2008, 17:18
von fusion44
Ja klar die m_'s waren das erste das gesucht und ersetzt wurde

.