Milkshape Parsen
-
Grüße,
hab folgendes Problem:
Will das Milkshape-Model-File parsen. Doch wenn ich in dem Datenstream mit den Originalstrukturen springe, springt er nicht an den richtigen Punkt. Springe ich mit den typen der Struktur springt er auch nicht richtig... mal ein Beispiel:const byte *pPtr = pBuffer; MS3DHeader *pHeader = ( MS3DHeader* )pPtr; pPtr += sizeof( MS3DHeader ); if ( strncmp( pHeader->m_ID, "MS3D000000", 10 ) != 0 ) <-- stimmt noch! return; if ( pHeader->m_version < 3 || pHeader->m_version > 4 ) <-- stimmt schon nicht mehr return; Beispiel2: const byte *pPtr = pBuffer; MS3DHeader *pHeader = ( MS3DHeader* )pPtr; pPtr += sizeof( char ); pPtr += sizeof( int ); if ( strncmp( pHeader->m_ID, "MS3D000000", 10 ) != 0 ) <-- stimmt noch! return; if ( pHeader->m_version < 3 || pHeader->m_version > 4 ) <-- stimmt schon nicht mehr return; Die Struktur: struct MS3DHeader{ char m_ID[10]; int m_version; };
Ach ja ich weis das es ein gute Tutorial gibt. Ich will es aber nicht einfach abschreiben.
Bitte helft mir was mache ich falsch?
Gibt es eigentlich eine Liste die die Daten der .ms3d Datei in byte auflistet?Bedanke mich schonmal bei Euch.
de Gortosch...
-
-
öhm... ja ich springe nicht an den richtigen Punkt...
hab ich das nicht gesagt?
Das möchte ich sehen wie du aus dem Hexeditor die Werte rausliest...
Warum springe ich nicht an den richtigen Punkt? Die Antwort würde mich brennend interessiern...de Gortosch....
-
gortosch schrieb:
öhm... ja ich springe nicht an den richtigen Punkt...
hab ich das nicht gesagt?
Das möchte ich sehen wie du aus dem Hexeditor die Werte rausliest...
Warum springe ich nicht an den richtigen Punkt? Die Antwort würde mich brennend interessiern...de Gortosch....
Ja. Dann komm bitte mit deinem File und der Doku vorbei. Weil du an den falschen Punkt springst?
Bye, TGGC \-/
-
kannst du mal bitte in sinnvollen sätzen reden?
Laut Doku., die DU ja bestimmt kennst sonst würdest du ja nicht hier posten,
ist der erste Teil des Files, wie auch schon oben geschrieben:
char m_ID[10];
also 1 byte * 10
In dem steht:
MS3D000000
stimmt ja auch.
Der zweite Teil ist ne
int Zahl:
eigentlich 4 doch da steht der pointer nicht nachdem ich ihn um die länge eines chars hochgezählt habe. Bzw. mit den Originalstrukturelementen darauf zugreifen will. Wie auch schon oben per Quellcode erklärt.de Gortosch...
Ps.: Und TGGC lass es einfach bitte ich hab noch kein post gesehen in dem du jemanden geholfen hast! Dass soll jetzt kein Angriff gegen dich sein... lass es einfach, bitte.
EDIT: Der Sprung mit den typen funktioniert jetzt war gestern einfach übernächtigt!
Aber der Sprung mit den Strukturen funktioniert nicht!
-
Um auf deine letzte Frage zu antworten: Ja.
Bye, TGGC \-/
-
schreibt der C++ Standard für bestimmte Datentypen eine "Ausrichtung" vor?
du kannst nicht einfach davon Ausgehen das dein Compiler den Speicher liniear anordnet, auch wenn es häufig so gemacht wird - bei Arrays schon - aber bei Strukturen nicht - hier wird gerne ein 32 Bit Alignment genommen - das ermöglicht schnelleren Zugriff auf die Datenstruktur
Im SDK steht der Hinweis
// force one byte alignmentSchau dir mal das Tutorial von RSN an - dort wird gezeigt wie man das erreicht
wenn du "nicht einfach abschreiben" willst, dann könntest du dazu einfach mal einen Artikel schreiben was es mit dem Byte Alignment auf sich hat und in irgendwo veröffentlichen (würde mich interessieren)
-
TGGC schrieb:
Um auf deine letzte Frage zu antworten: Ja.
Bye, TGGC \-/
Geilt dich das auf? Dein Getrolle nervt gewaltig.
-
Nein.
Bye, TGGC \-/
-
Mich aber.
-
So der Modelloader läuft, hab jetzt die Strukturen mit dieser Packet-Struktur angelegt. Weis nur das diese Definition die Strukturelemente hintereinander in den Speicher schreibt. Nur nicht genau warum und wie!
Nuch suche ich Theorie über diese Materie, habe schon in mehreren C und C++ Büchern
geschaut. Entweder immer unter dem falschen Begriff oder es steht da nichts drinne.Vielleicht kann mir von Euch jemand Material in Form von z.B. einen Link geben.
Wenn nicht dann werd ich am Di. mal meinen Prof. löchern.de Gortosch...
-
Buch? Prof? Kann man alles per HexEd und Debugger selbst testen.
Bye, TGGC \-/
-
ich will nicht wissen wie es im Speicher steht, sondern den Hintergrund zum Quellcode kennen. Wissen ob es verschiedene Möglichkeiten gibt usw.. Wie gesagt nicht einfach was benutzen, sondern verstehen. Ich hab jetzt einfach mal einen Quellcode von einem anderen benutz weis aber nicht genau was der macht, naja ich weis eigentlich schon was der macht, man ich will enfach über dieses Thema was lesen um genauer darüber bescheid zu wissen. Ist das so schwer zu verstehen das jemand lernen will?
Und noch was dein Klugscheissmodus geht mir langsam auf die Nerven. Bitte tu mir einen Gefallen und poste nicht mehr auf meine thread auf deine Kommentare kann ich gerne verzichten.
-
Hmm, dann schau doch in die Doku zu deinem Compiler, da steht was "diese Definition" macht.
BTW: Ich klugscheiss, wo ich will.
Bye, TGGC \-/
-
vielleicht hilfts (ich nehm mal an das du mit msvc 6.0 oder höher programmierst):
wie gesagt wäre es schön, wenn du zu einer erkenntniss darüber gekommen bist, mal hier in diesem Thread zu erklären warum das so ist...
- übrigens wenn du ein spiel programmieren willst dann ist deine vorgehensweiße falsch - 2 bis 3 tage verscheißen wegen der Ausrichtiung von den Bytes ist unsinn - außer es bringt etwas für den Fortschritt des Spieles - wenn du einfach nur jemand bist der sich gerne mit so schönen Themen wie Byte Alignment auseinandersetzen willst dann schön für dich - ich glaube ohne Kenntnisse in der Systemnaher Programmierung (die man nicht unbedingt hat, wenn man die Syntax von C++ kennt) wirst du dich schwer tun warum eine bestimmte Adressierungsart schöner oder besser ist
mit einem Hexeditor siehst du wie eine Datei im Speicher angeordnet ist (die einzelnen Bits)- wahrscheinlich ist dir das nicht klar, weil du keine Ahnung hast was man mit einem Hexeditor alles machen kann
du kannst selber ein programm programmieren das eine Datei abspeichert -dabei wirst du durch einen Hexeditor sehen wie deine Daten im speicher landen
schön wäre es allgemein zu wissen wie es ein Compiler macht - was der Standard vorschreibt usw.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_core_.2f.zp.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_predir_pack.asp
-
What ist Byte Alignment?
- bitte schreib am ende eine zusammenfassung wie im ms3d format der "speicher angeordnet" ist und was zu tun ist um mit msvc 6.0 eine ms3d file korrekt laden zu können
-
"Actually just remembered what your problem maybe, I had the same problem myself. Visual Studio (and most compilers) will pad your structure so it is of a certian multiple, so it is faster for memory retrival. So your structure isnt the right size and stuff. Turn this off and you should be fine, to do this in Visual Studio C++ (atleast version 6.0 dont know about others), go to Project, Project Settings,C++, change category to code generation then change the struct memory alignment to 1 byte. This might fix your problem (if it doesnt turn it back as its normally a good thing).
There is a way (some #pragma or something) to only select the alignment option for those structures only so you still get the speed on others in your project but I cant for thelife of me remember what (only ever seen it used once), should be easy to search for."
http://www.gamedev.net/community/forums/topic.asp?topic_id=206054
ich erwarte eine Zusammenfassung von dir!
-
zu deiner beruhigung sei gesagt, dass du nicht der einzige bist.
das is so ziemlich das häufigste anfängerprob im zusammenhang mit ms3d dateien...
-
könnte auch dran liegen das ms3d scheisse ist
-
warum?