Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.07.2008, 14:07

Problem mit 3DS Reader

Hi,

ich hab mir einen 3ds Reader geschrieben. (Geht die Chunks durch und verarbeitet diese).

Das Problem tritt bei mir jetzt beim lesen der Chunkheader auf.
Und zwar scheint bei der TriBase die ChunkHeader Struktur 6 Byte
groß zu sein (Muss so sein da der Header in der 3DS Datei 6Byte groß ist und der Reader der TriBase funktioniert^^).

C-/C++-Quelltext

1
2
3
4
5
6
// Struktur für einen Chunk-Headers aus einer 3DS-Datei

struct TRIBASE_API tb3DSChunkHeader
{
    WORD    wChunkID;
    DWORD   dwChunkSize;
};


und meine 8 Byte

C-/C++-Quelltext

1
2
3
4
5
struct _3DSChunkHeader
{
    WORD  ChunkID;
    DWORD ChunkSize;
};


Ist das eine Kompileränderung(habe vc++ 2008) oder hab ich da irgend nen fehler gemacht den ich nicht seh?
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

13.07.2008, 14:13

das problem ist das padding das der compiler zwischen den struct membern einfügt.

lässt sich bei MSVC über vielerlei wege umstellen (/Zp compiler switch, #pragma pack, pshpackn.h, ...). am einfachsten ist aber, du liest deine member einzeln aus der datei und nicht das ganze struct auf einmal. dann wirst du solche probleme nie bekommen ;)

3

13.07.2008, 14:18

ok. Vielen dank für die schnelle Antwort^^
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

4

13.07.2008, 15:10

Zitat von »"dot"«


lässt sich bei MSVC über vielerlei wege umstellen (/Zp compiler switch, #pragma pack, pshpackn.h, ...). am einfachsten ist aber, du liest deine member einzeln aus der datei und nicht das ganze struct auf einmal. dann wirst du solche probleme nie bekommen ;)

einfach? ich finde das andere erheblich einfacher. außerdem spart man ne menge code. was müsstest du schreiben, wenn du ne struct abspeicherst, die wirklich mal 400 member hat -> owned

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

13.07.2008, 16:56

Zitat von »"BlackSnake"«

einfach? ich finde das andere erheblich einfacher. außerdem spart man ne menge code.


und code sparen bedeuetet automatisch ein besseres programm...!?

Zitat von »"BlackSnake"«

was müsstest du schreiben, wenn du ne struct abspeicherst, die wirklich mal 400 member hat -> owned


wenn ein struct 400 member hat stell ich erstmal generell meine zurechnungsfähigkeit in frage und führ einen integritätscheck durch ;)

was wenn du dein programm auf ne andre platform portieren willst mit nem compiler der #pragma pack net kennt, oder wo der header pshpack1.h net existiert, oder was wenn dein programm auf ner platform laufen soll wo padding erforderlich ist!?

man könnte argumentieren dass das lesen aus der datei etwas effizienter abgewickelt wird, wenn man größere blöcke auf einmal liest. das ist vielleicht wahr (da das lesen eh gepuffert wird hast du halt den overhead der zustätzlichen funktionsaufrufe). allerdings ist der zugriff auf nicht nicht ausgerichtete adressen und damit auf die member der so gepackten structs üblicherweise (z.b. bei x86) erheblich langsamer (vor allem bei großen strukturen), auf machen platformen sogar unmöglich (kompilliert net, löst ne hardware exception aus o.ä.)

Werbeanzeige