Einzelnen Beitrag anzeigen

lagalex

Registriert seit: 16. Jan 2011
7 Beiträge
 
#1

Datei mit dynamischen Array einlesen

  Alt 18. Feb 2013, 16:29
Hallo allerseits,

Ich steh vor einem Problem und weiß nicht, wie ich es lösen könnte, da immer beim Dimensionieren ein Fehler auftritt, vielleicht kann mir wer weiterhelfen:

Ich möchte ein File als stream einlesen, das zuerst aus einem statischen Header besteht, dann aber je nach Inhalt dynamisch wird:

type TFileHeader = packed record
FileCode :LongInt;
[...]
end; // ist 100 Bytes groß

nach diesem statischen Header kommt immer ein Record Header mit folgender Struktur:

type TRecordHeader = packed record
ID : LongInt; // Big Endian 4 Byte
Laenge : LongInt; // Big Endian 4 Byte
end;

ID zählt einfach beginnend von 1 hinauf, Laenge gibt die Größe des nachfolgenden Records an.

danach kommt eben der Objekt-Record, der je nach Wert einer bestimmten Variable im FileHeader eine andere Struktur hat (es handelt sich hierbei um .shp - ESRI Shapefiles):

Mein Problem taucht bei folgender Struktur auf:

type TObjektRecord = packed record
ShapeType : LongInt;
Box : TBox; // ist x1,y1,x2,y2 of Double = Rechteck
NumParts : LongInt;
NumPoints : LongInt;
Parts : Array of LongInt;
Points : Array of TPunktXY; // ist X,Y : Double
end;

NumParts sagt mir, wie viele Elemente im Array Parts sind.
NumPoints sagt mir, wie viele Elemente im Array Points sind.

Wenn ich jetzt eben hergehe und sage:

var Strom : TFileStream;

try
Strom:=TFileStream.Create(Dateiname, fmOpenRead);
Strom.Read(FileHeader, SizeOf(FileHeader));
except
[...]
end;

alles kein Problem, jedoch

repeat
// RecordHeader einlesen
Strom.Read(RecordHeader, SizeOf(RecordHeader));
Strom.Read(varShapeType, SizeOf(varShapeType));
Strom.Read(varBox, SizeOf(varBox));
Strom.Read(varNumParts, SizeOf(NumParts));
Strom.Read(varNumPoints, SizeOf(NumPoints));
SetLength(varParts, NumParts); <--------------- Hier kommt dann spätestens die AV, Programmabbruch
SetLength(varPoints, NumPoints);
Strom.Read(varParts, SizeOf(varParts));
Strom.Read(varPoints, SizeOf(varPoints));
until (Strom.Position>FileHeader.FileLen);

Was mache ich falsch, wo ist mein Denkfehler drin?

Vielen Dank im Voraus!!

LG Alex
  Mit Zitat antworten Zitat