GoaSkin
Gast
Ich programmiere gerade ein Programm, das dazu dienen soll, GUI-gesteuert Plugins für ein Spiel zu erzeugen und lege dabei Wert auf Plattformtransparenz.
Ich habe mich dazu entschlossen, die QT-Bibliothek zu nutzen und XCode als Entwicklungsumgebung zu nutzen. Soweit so gut, der Quellcode lässt sich unter Windows, OSX und Linux compilieren und das Programm läuft --scheinbar-- auf allen Plattformen einwandfrei. Das dachte ich bis vor kurzem zumindest.
Ich habe nun das Programm einmal auf einem G4 compiliert und ausgeführt und wunderte mich die ganze Zeit, daß die erzeugten Dateien korrupt sind. Nach einigen Analysen stellte ich fest, daß sämtliche Ausgabevariablen in der Datei in umgekehrter Byte-Reihenfolge zu lesen sind. Die Endian-Problematik war eine schnelle Vermutung, die sich auch bestätigte.
In der Export-Funktion wird gemäß Spezifikation ein langer Array mit allen notwendigen Daten erzeugt und dieser anschließend in eine Datei geschrieben. PPC-Rechner schreiben alle einzelnen Variablen verkehrt herum in diesen Array rein.
Das Netz verrät viel, mit welchen Funktionen sich Byte-Reihenfolgen umdrehen lassen, wobei ich das kaum für praktikabel halte. Unter anderem wird eine Header-Datei mit Funktionen zur Endian-Konvertierung mit dem Ziel, Netzwerkdaten umzudrehen genannt, die man auch nutzen kann, um einzelne Variabeln zu drehen. Das wäre in diesem Fall viel Arbeit, würde den Quellcode sehr unübersichtlich machen und für 64Bit-Integer müsste ich mir noch eine Lösung einfallen lassen.
Gibt es keine Lösung (z.B. ein Makro), mit der man im Quelltext nicht permanent darauf achten muß, daß ein PPC im Big-Endian-Modus arbeitet und dafür sorgt, daß einzelne Werte grundsätzlich so in einen Array eingetragen werden, als wäre es eine Little-Endian-Maschine?
Da ja ein PPC angeblich auch den Little-Endian-Modus beherrscht - gäbe es ggf. die Möglichkeit, dafür zu sorgen, daß das Programm im Little-Endian-Modus läuft?
Unter Linux (PPC) kann man das gcc-Flag -m little setzen. Unter Darwin kennt der GCC das nicht.
Ich habe mich dazu entschlossen, die QT-Bibliothek zu nutzen und XCode als Entwicklungsumgebung zu nutzen. Soweit so gut, der Quellcode lässt sich unter Windows, OSX und Linux compilieren und das Programm läuft --scheinbar-- auf allen Plattformen einwandfrei. Das dachte ich bis vor kurzem zumindest.
Ich habe nun das Programm einmal auf einem G4 compiliert und ausgeführt und wunderte mich die ganze Zeit, daß die erzeugten Dateien korrupt sind. Nach einigen Analysen stellte ich fest, daß sämtliche Ausgabevariablen in der Datei in umgekehrter Byte-Reihenfolge zu lesen sind. Die Endian-Problematik war eine schnelle Vermutung, die sich auch bestätigte.
In der Export-Funktion wird gemäß Spezifikation ein langer Array mit allen notwendigen Daten erzeugt und dieser anschließend in eine Datei geschrieben. PPC-Rechner schreiben alle einzelnen Variablen verkehrt herum in diesen Array rein.
Das Netz verrät viel, mit welchen Funktionen sich Byte-Reihenfolgen umdrehen lassen, wobei ich das kaum für praktikabel halte. Unter anderem wird eine Header-Datei mit Funktionen zur Endian-Konvertierung mit dem Ziel, Netzwerkdaten umzudrehen genannt, die man auch nutzen kann, um einzelne Variabeln zu drehen. Das wäre in diesem Fall viel Arbeit, würde den Quellcode sehr unübersichtlich machen und für 64Bit-Integer müsste ich mir noch eine Lösung einfallen lassen.
Gibt es keine Lösung (z.B. ein Makro), mit der man im Quelltext nicht permanent darauf achten muß, daß ein PPC im Big-Endian-Modus arbeitet und dafür sorgt, daß einzelne Werte grundsätzlich so in einen Array eingetragen werden, als wäre es eine Little-Endian-Maschine?
Da ja ein PPC angeblich auch den Little-Endian-Modus beherrscht - gäbe es ggf. die Möglichkeit, dafür zu sorgen, daß das Programm im Little-Endian-Modus läuft?
Unter Linux (PPC) kann man das gcc-Flag -m little setzen. Unter Darwin kennt der GCC das nicht.