Wie übersetzt mal solchen C++ code?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fusion44
User
Beiträge: 7
Registriert: Montag 12. Mai 2008, 14:27

Sonntag 12. Oktober 2008, 14:34

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 12. Oktober 2008, 14:40

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
Benutzeravatar
snafu
User
Beiträge: 5459
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 12. Oktober 2008, 15:05

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.
fusion44
User
Beiträge: 7
Registriert: Montag 12. Mai 2008, 14:27

Sonntag 12. Oktober 2008, 16:56

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. :)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Sonntag 12. Oktober 2008, 17:24

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.
BlackJack

Sonntag 12. Oktober 2008, 17:34

@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:

Code: Alles auswählen

mult_x = int(round(x / mult))
@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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Sonntag 12. Oktober 2008, 17:37

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.
fusion44
User
Beiträge: 7
Registriert: Montag 12. Mai 2008, 14:27

Sonntag 12. Oktober 2008, 20:03

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
BlackJack

Sonntag 12. Oktober 2008, 22:10

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.
fusion44
User
Beiträge: 7
Registriert: Montag 12. Mai 2008, 14:27

Montag 13. Oktober 2008, 17:18

Ja klar die m_'s waren das erste das gesucht und ersetzt wurde :).
Antworten