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

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

1

09.06.2006, 22:55

sizeof() - Anomalie??

Hallo!

Ich habe jetzt eine komische Feststellung gemacht! Und zwar, dass sizeof() falsch Werte liefert!?
Und zwar tritt dieses Problem bei struct's auf! Die Größe wird teilweise zu groß zurückgegeben, und ich versteh nicht wieso!!?
Zum Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Test
{
    char   c;
    WORD w;
};
//sizeof(Test) == 4 -->?? Eigentlich 3


//-----------------------------------------------------


struct Test
{
    float f;
    char c;
};
//sizeof(Test) == 8 -->?? Eigentlich 5


//-----------------------------------------------------


struct Test
{
    float f;
    short s;
    DWORD dw;
};
//sizeof(Test) == 12 -->?? Eigentlich 10


Habt ihr eine Ahnung was das soll!? Kann ich mich jetzt nicht mehr auf sizeof() verlassen? Diese "Fehler" sind ja fatal, wenn man Dateien mit Hilfe von Strukturen auslest!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

2

09.06.2006, 22:57

Das ist kein Fehler sondern ein Feature, schreib oben einfach mal ein #pragma pack(1) drüber, dann geht das auf.

Das wird gemacht, da eine CPU in Zweierpotenzen besser rechnen kann, als mit Werten wie 3, 17 usw.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

09.06.2006, 23:01

Danke!

Aber ist das nicht absolut fatal, wenn man das nicht macht?!

edit:
Ich versteh irgendwie nicht, wieso es bis jetzt bei mir funktioniert hat, Dateien mit Strukturen und sizeof() auszulesen... Dürfte das nicht eigentlich ununterbrochen zu Fehlern führen?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

09.06.2006, 23:06

Nein
Da die Größe ja immer gleich ist. Ob da nun 1byte Datenmüll dran hängt oder nicht, ist beim Laden und Sichern egal. Ist die Datei halt mit eine Byte Datenmühl belastet...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

09.06.2006, 23:10

Wenn ich sie vorher selbst geschrieben habe schon, aber sonst nicht... Ich meine jetzt die 3ds oder ms3d Dateien... da wird dann zu viel ausgelesen, und der Dateicursor steht dann auch noch auf der falschen Position, oder wird da magischerweise plötzlich die eigentliche Größe verwendet!?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

6

09.06.2006, 23:11

Wenn es jetzt mit Binären Dateiformaten zusammenhängt, ist #pragma pack(1) pflicht. Da das lesen mit der länge von sizeof sonst Fehler verursacht.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

7

09.06.2006, 23:18

Eben da bin ich gerade auf diesen "Fehler"/Feature gestoßen... Da hat nichts mehr zusammengestimmt ;)
Ich frag mich nur, wieso dann mein 3ds-Reader funktioniert... *kopfkratz*
Naja! Danke jedenfalls für diese absolut wichtigen Informationen!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

09.06.2006, 23:20

Es ist nur Pflicht, wenn das Format nicht mit Chunks arbeitet und mit Pragma(1) geschrieben wurde. Sonst funktioniert das wunderbar, also keine Panik.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

ext

Treue Seele

  • Private Nachricht senden

9

10.06.2006, 13:26

Wenn die Strukturen des 3ds Formats bereits aligned sind, dann muss der Compiler keine Füllbytes einfügen.
Ansonsten ist es beim Speichern immer ratsam pack(1) zu verwenden.

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

10.06.2006, 23:34

Jedoch sollte meiner Meinung nach die ursprüngliche Ausrichtung später wieder hergestellt werden:

C-/C++-Quelltext

1
2
3
4
5
#pragma pack( push, 1 )

// ...


#pragma pack( pop )

Werbeanzeige