struct Deklaration für ein Dateiformat
-
ich habe folgenden Pseudocode für ein Dateiformat
short stringLength; char string [stringLength]; short effectCount; repeat effectCount short effectID; short effectData; end repeatich denke es ist klar wie die Datei aussieht. um nun Daten einfach auslesen und speichern zu können würde ich mir gerne ein entsprechendes struct deklarieren. Das Problem ist aber, das aber die Konstanten stringLength und effectCount nicht bekannt sind. Ich kann also nicht sowas wie
struct { short stringLength; char str[stringLength]; short effectCount; struct { short effectID; short effectData; } effects [effectCount]; } foo;in meinen Header schreiben. Wie würde man soetwas lösen bzw programmtechnisch abbilden um einfach mit einer solchen Datei arbeiten zu können?
-
Hi !
Das ganze mal ein bisschen anders aufgeschrieben:
struct Effects { short effectID; short effectData; }; struct Data { short stringLength; char* str; short effectCount; struct Effects* effects; };Ok, Datei öffnen, stringLength einlesen, Speicherplatz stringLength+1 für str reservieren, String einlesen,
effectCount einlesen, Speicherplatz effectCount * sizeof(struct Effects) reservieren, Struktur(en) einlesen.Steht das ganze wiederholt, mehrmals in einer Datei drin, so brauchst du ein Data-Array, oder verkettest die Strukturen in einer Liste:
struct Data { short stringLength; char* str; short effectCount; struct Effects* effects; struct Data* next; };
-
Danke Dir
So funktioniert es natürlich (und genaso habe ich es im Moment auch). Das Problem ist nur, das das ziemlich langsam ist, weil man immer nur jeweils ein paar Bytes von der Datei liest. Bevor ich das jetzt weiter verfolge und das optimiere (z.B. größere Teile der Datei einlesen,diese dann parsen und memcpy in den speicher von new reinkopieren) erstmal meine Träume:Ich hatte es mir eigentlich so ausgemalt, daß ich einfach die Datei komplett in einem Rutsch in einen Buffer lade (da ich eh die komplette Datei brauche) und dann einfach nur noch eine Reihe von Pointern auf diese noch zu definierenden Structs habe, die auf die entsprechende Stelle im Buffer zeigen.
So könnte ich mir dann das ganze speicheranfordern mit new sparen und könnte auf den Inhalt der Datei bequem über die structs zugreifen.
-
Der Zugriff auf diese Weise wird langsamer, als ein Zugriff über einen Data-Array-Index, weil dafür mehr Maschinenbefehle nötig sind.
Mindestens ein mov und ein add, der den Offset auf die erste Strukturposition draufaddiert, pro Zugriff wohlgemerkt. Bei mehreren Tausend Datensätzen, werden es mehrere Tausend movs/adds zusätzlich.

-
hm interessant. von der seite hab ich das noch gar nicht betrachtet.
-
Ja, einfach ein kleines Vergleichsbeispiel schreiben und das Disassembly angucken^^