B
Ok, vielen Dank schonmal!
@Solaris'dUKe:
ich weiß zwar nicht warum genau der compiler das macht, aber er scheint auf den nächsten 4er-pack auf zu runden.
ich hab das problem durch
#pragma pack(n) // n=1 oder 2;4;8;16
lösen können
Zu meinem anderen Problem:
Ich hoffe ich hole nicht zu weit aus wenn ich euch jetzt mein ganzes Problem erkläre. Fall doch dann antwortet mir bitte einfach nur auf ein Tutorial in dem mir beschrieben wird binäre Dateien elegant und effektiv zu schreiben, lesen und zu editieren.
Ersteinmal der Aufbau der Dateien die ich lesen will:
512 Blöcke der LandTileGroup
512 Blöcke der StaticTileData
LandTileGroup
DWORD unknown
32 Blöcke [Land Tile Data]
StaticTileGroup
DWORD unknown
32 Blöcke [Static Tile Data]
(wer's gern genauer haben will liest hier: http://dkbush.cablenet-va.com/alazane/file_formats.html#3.19)
Dafür habe ich diese Structs geschrieben. Ich möchte also mit diesen beiden Arrays die ganze Datei auf einmal lesen, dann das nötige in den Arrays ändern und dann die beiden Arrays wieder in die Datei schreiben.
Zu meinem Programm:
StaticTileGroup StaticGroups = new StaticTileGroup[512];
LandTileGroup LandGroups = new LandTileGroup[512];
if ((handle = fopen("tiledata.mul", "rb")) == NULL)
{
}
rewind(handle);
fread(LandGroups, 428032, 1, handle); // ja Solaris'dUKe, ich ändere das noch :P
fread(StaticGroups, 608256, 1, handle);
fclose(handle);
return *StaticGroups;
das ist ein teil der Funktion read(), die offensichtlich den Rückgabewert StaticTileGroup hat. Das klappt auch alles ganz toll soweit wenn da nicht noch ein Problem wäre:
int main(int argc, char* argv[])
{
int gruppe, nummer;
StaticTileGroup *x = new StaticTileGroup[512];
if (argc==2)
{
gruppe = GetGroupNumber(StrToInt(argv[1]));
nummer = StrToInt(argv[1]) - gruppe * 32 - 1;
*x = read(StrToInt(argv[1]));
printf("Tilename %s\n", &(x[gruppe].data[nummer].tilename));
}
(...)
}
Zu "gruppe" und "nummer": Ich hab ja 512 Gruppen habe mit je 32 Untergruppen. Um von einer explizit angegebenen Nummer (in Form des argv) die Gruppe und Untergruppe zu finden benutze ich eben diese Formel.
Leider bekomme ich nur eine Ausgabe wenn ich Zahlen zw. 1 und 32 als Argument beim Programmstart angebe. Dh "gruppe" ist dann 0 und "nummer" zwischen 0 und 31. Es ist also bildlich gesprochen als wär das Array nur 1 Feld Groß, also
StaticTileGroup *x = new StaticTileGroup[1];
Ich hoffe ich habe euch mein Problem etwas näherbringen können