[GELÖST] structs ARM-freundlich auslesen


zico

Member
Joined
Jun 3, 2006
Messages
273
Ich bastel imme rnoch am Descent1 port für den GP2X.

Langsam bringt mich diese Architektur zur Verzweifelung:

ich habe eine cfreadFunktion, welche als eien Art wrapper für fread() dient um somit daten aus den Spieldateien von Descent auszulesen. Diese Daten sind von unterschiedlichster Art.

Bei INteger Werten funktioniert dies auch wunderbar, doch lese ich ein struct damit aus, so kriege ich keine gültigen Werte mehr zurück.

Hab ich vllt eine wichtige Compiler Option übersehen, die für solche Dinge zuständig ist, oder muss ich nun jedes einzelne Element des Structs einzeln auslesen?

Ideen?
 
Re: structs ARM-freundlich auslesen

<r><QUOTE author="Zico"><s>
Zico said:
</s>Ich bastel imme rnoch am Descent1 port für den GP2X.<br/>
<br/>
Langsam bringt mich diese Architektur zur Verzweifelung:<br/>
<br/>
ich habe eine cfreadFunktion, welche als eien Art wrapper für fread() dient um somit daten aus den Spieldateien von Descent auszulesen. Diese Daten sind von unterschiedlichster Art.<br/>
<br/>
Bei INteger Werten funktioniert dies auch wunderbar, doch lese ich ein struct damit aus, so kriege ich keine gültigen Werte mehr zurück.<br/>
<br/>
Hab ich vllt eine wichtige Compiler Option übersehen, die für solche Dinge zuständig ist, oder muss ich nun jedes einzelne Element des Structs einzeln auslesen?<br/>
<br/>
Ideen?<e>
</e></QUOTE>

Vorraussetzung dafür, dass das Auslesen erfolgreich klappt ist doch, dass die verwendeten Datentypen exakt die gleiche Länge haben, wie auf dem Originalsystem (und natürlich auch die selbe Byte-Order). Wenn das nicht sicher so ist, bleibt wohl als einzige Möglichkeit die alle Elemente einzeln auszulesen oder die Datentypen im struct genau so zu wählen, dass sie die richtigen Längen haben.</r>
 
Eventuell müssen auch Ausrichtungen der einzelnen Struct - Elememte an 2/4/8 Byte - Position beachtet werden. Sind diese im Compile eventuell eingeschaltet und beim lesen werden so mehr Bytes aus dem Stream gelesen, als gespeichert wurden.

Sind die nachfolgenden Integer - Werte wieder korrekt, oder stimmen diese Werte nach dem einlesen eines Struct nicht mehr?

Gruß
Thomas
 
Wenn ich nach dem auslesen eines structs einen Integer auslese, stimmt diese auch nicht mehr, das ist korrekt.
Auch werden in den structs meist unterschiedliche Typen verwendet.
Ich dachte bisher, dass ich vllt einfach eine Compiler Option vergessen habe, damit diese im Struct korrekt ausgelesen werden.
FALLS das geht, würde ich am liebsten diese Option nutzen, anstatt für jede der ca 20 Operationen eine funktion zu schreiben, verständlich, oder *g*?

Ich hatte auch schon angefangen, diese Funktionen zu schreiben, doch komm ich dann aus irgendeinem Grund mit anderen Teilen des Codes ins Gehege (warum weiss ich leide rnoch nicht), weswegen ich auch eine "normale" Lösung bevorzugen würde...
 
So richtig raffen tu ich die Problematik nicht.
Ich dachte wenn das auslesen der Daten bei Descent 1 aufm PC läuft, warum sollte das denn nicht auf der GP2X genau so funktionieren ? - Ist fread nicht portabel oder warum musst du einen wrapper bauen ?

Kann ich irgendwo den momentanen Stand deines Ports saugen und damit herumspielen ? Mich würde es einfach mal interessieren, ausserdem könnte es mit bei anderen/zuküntigen Ports helfen, man lernt ja schließlich nie aus

Oder schreib mir ne PN mit nem Downloadlink, bin zwar am basteln an einem eigenen Spiel, aber etwas Zeitvertreib ist nie verkehrt ^_^

Sonst kannst du dich auch gerne bei ICQ melden, bin heute Abend bestimmt online.
 
Nun ich dachte bisher auch, dass es kein Problem sein sollte, die Daten auszulesen.

Bei dem "wrapper" für fread handelt es sich um folgende Funktion - vllt hilft das auch weiter:
Code:
size_t cfread( void * buf, size_t elsize, size_t nelem, CFILE * fp ) 
{
	int i;
	if ((int)(fp->raw_position+(elsize*nelem)) > fp->size ) return EOF;
	i = fread( buf, elsize, nelem, fp->file );
	fp->raw_position += i*elsize;
	return i;
}

Ich nehm schon an, dass im speziellen "i" hier für das Problem verantwortlich ist, zumindest für den GP2X.
Wie schon gesagt: Integer auslesen funktioniert damit wunderbar. Komme ich jedoch zu einem Struct wird diese Rückgabe, so wie alle weiteren folgenden zerstört (Rückgabe von reisig großen/kleinen Werten).

@scachi
Wenn du heut Abend da bist, kann ich dir den Code und die entsprechenden Stllen gerne zeigen :) Danke für das Hilfsangebot.
 
@Zico
argh.. scons...
argh.. x11 Abhängigkeiten
argh.. compiler warnungen
argh.. shareware version nur als .exe (dos)
argh.. bin ich planlos, hätte ich mich doch auch mal mit scons beschäftigt :roll:
In welcher Ecke kann ich mich bei dir ausheulen und um Hilfe bitten -d1x spezifisch? :wink:
 
Ich bin ein Stück weitergekommen:
Anstatt alle Elemente der structs einzeln auszulesen, habe ich mir die read anweisungen genau angeschaut.

Bei der übergabe in die cfread funktion wird *zur Ermittlung der Größe des structs* eben genau diese mit angegeben.
Dies erfolgt mit sizeof(STRUCTNAME).
Einige bekommen auch gleich bsp sizeof(int) mit auf den Weg (falls es sich nicht um ein struct handelt).

Nun der Knackpunkt: die Größe von Struct (und wenn ich das richtig sehe auch die Größe von unsigned bytes etc) wird auf dem GP2X vollkommen anders über sizeof ausgegeben als auf dem PC.

Ich kann mir eigentlich kaum vorstellen, dass es sich dabei um einen Programmfehler im Code handeln könnte. Zumidnest hoffe ich das nicht, da es hunderte sizeof's im Code gibt, die ich nicht alle ersetzen will...
 
Lustig, die Idee hatte ich auch noch bevor ich in die Falle bin.
Ich wollte mir mal alle möglichen Größen (Datentypen, bzw dem Struct und dessen einzelnen Elemente) mit sizeof einmal auf dem PC und einmal auf der GP2X ausgeben lassen um zu vergleichen oder zu sehen wo Unterschiede bestehen, da ich gesehen habe das in der bm.c (glaube ich) auch nen "dirty hack" für nen Alpha und irgendwas noch vorhanden ist. :wink:
 
Naja die sauberste Lösung ist das natürlich auch nicht. Der Offset für die structs ist dann zwar korrekt, doch Ob die Werte dann auch den Slots zugewiesen werden, die sie brauchen ist unwahrscheinlich.

NAch einem Plausch mit einigen anderen Descent Entwicklern (die sich auch mit ARM und BigEndian wg. MAC beschäftigen) scheint es hier die Lsöung einer Compiler Option zu gebem. Die frage ist noch welche.
 
Gelöst!

<r><CODE><s>
Code:
</s>-mstructure-size-boundary=8<e>
</e></CODE> <br/>
<br/>
als CFLAG gibt endlich die richtigen Werte von sizeof(STRUCT) und somit auch dem ganzen Struct an sich zurück <E>:D</E><br/>
<br/>
Danke für all die vielen Antworten <E>:)</E></r>
 
Re: Gelöst!

<r><QUOTE author="Zico"><s>
Zico said:
</s><CODE><s>
Code:
</s>-mstructure-size-boundary=8<e>
</e></CODE> <br/>
<br/>
als CFLAG gibt endlich die richtigen Werte von sizeof(STRUCT) und somit auch dem ganzen Struct an sich zurück <E>:D</E><br/>
<br/>
Danke für all die vielen Antworten <E>:)</E><e>
</e></QUOTE>
Genial, so einfach kann es sein <EMOJI seq="1f609">:wink:</EMOJI></r>
 
Back
Top