Zitat von
marabu:
Guten Morgen,
auch die Methoden SaveToFile() und LoadFromFile() von TStrings arbeiten mit Textdateien - und mit dem Zeilentrenner CR/LF für solche Dateien. Du möchtest beliebige Zeichen (#0..#255) in deiner Datei speichern, wie man auch an deiner Musterdatei sehen kann. Kritisch sind dabei solche Zeichen wie #0 (NULL) #13 (CR) #10 (LF) und gelegentlich #26 (EOF), weil sie bei der Verarbeitung von Text als Steuerzeichen interpretiert werden.
Achso ... Okay...
Zitat von
marabu:
Das Schlüsselwort PACKED kannst du mit strukturierten (record) und wiederholten (array) Feldern benutzen um die Ausrichtung einzelner Felder an Doppelwortgrenzen zu verhindern, was zwar das Laufzeitverhalten günstig beeinflusst, aber den Speicherverbrauch stark erhöht. Mir ist eine kompakte Speicherung wichtig, da ich die Matrix als Speicherblock behandeln möchte.
Verstehe ich noch net ganz
Zitat von
marabu:
Wenn die Dimensionen deiner drei-dimensionalen Matrix nicht feststehen, dann musst du sie mit in die Datei schreiben, vorzugsweise als Header davor:
Indirekt weiß ich die Größe, da die Breite der Datei, die Breite der Map sein wird, und die Höhe der Datei, die Höhe der Map durch 4...
Also müsste ich nichts im Header schreiben
Obwohl ich dann das Problem bei #10 und #13 hätte, da die ja ein Zeilenumbruch verursachen... Also doch Header
Zitat von
marabu:
Delphi-Quellcode:
const
LEVELS = 4;
ROWS = 12;
COLS = 12;
type
TMatrix = packed array of array of array of Byte;
procedure RedimMatrix(var m: TMatrix; dim: array of Byte);
begin
SetLength(m, LEVELS, ROWS, COLS);
end;
Das ist verstanden
Zitat von
marabu:
Delphi-Quellcode:
procedure SaveMatrix(m: TMatrix; fn: TFileName);
var
dwDim, dwSize: Cardinal;
begin
dwDim := (Length(m) shl 8 + Length(m[0])) shl 8 + Length(m[0, 0]);
dwSize := Length(m) * Length(m[0]) * Length(m[0, 0]);
with TFileStream.Create(fn, fmCreate) do
try
Write(dwDim, SizeOf(dwDim));
Write(m, dwSize);
finally
Free;
end;
end;
Ähm...
1. Was ist shl?
2. Soll dwDim der Header sein?
3. Was ist "SizeOf"? Soetwas wie "Length"?
Zitat von
marabu:
Delphi-Quellcode:
procedure LoadMatrix(var m: TMatrix; fn: TFileName);
var
dwDim, dwSize: Cardinal;
begin
with TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite) do
try
Read(dwDim, SizeOf(dwDim));
SetLength(m, Hi(dwDim), Lo(dwDim) shr 8, dwDim and $FF);
dwSize := Length(m) * Length(m[0]) * Length(m[0, 0]);
Read(m, dwSize);
finally
Free;
end;
end;
Also das stößt schon auf weitere Verständnisprobleme:
1. dwDim hat ja noch keine Größe, aber warum funktioniert dann SizeOf?
2. Hi = High? Lo = Low? Oder was für Funktionen sind das?
Zitat von
marabu:
Delphi-Quellcode:
procedure TestMatrix;
const
FN = '
c:\daten\dp\map.f2m';
var
m: TMatrix;
iLevel, iRow, iCol: Integer;
begin
RedimMatrix(m, [LEVELS, ROWS, COLS]);
for iLevel := Low(m)
to High(m)
do
for iRow := Low(m[0])
to High(m[0])
do
for iCol := Low(m[0, 0])
to High(m[0, 0])
do
m[iLevel, iRow, iCol] := 48 + iLevel * 4 + iRow * iCol
mod 10;
SaveMatrix(m, fn);
FillChar(m, SizeOf(m), 0);
LoadMatrix(m, fn);
end;
Das ist wieder logisch! Danke erstmal dafür