Einzelnen Beitrag anzeigen

Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#13

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 26. Feb 2008, 10:26
Das würde gehn, wenn ich solche Arrays öfter brauchen würde würde ich die Klasse bestimmt machen, hab es nun fertig gemacht und es Funktioniert wunderbar .

Hier für alle Neugierigen :
Delphi-Quellcode:

Procedure LoadLetterData;
Var
  f: TFilestream;
  i, j, w, h, k: Integer;
  b: Byte;
Begin
  If Fileexists(IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'Letters.dat') Then Begin
    f := TFileStream.create(IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'Letters.dat', fmopenread);
    // Wir Speichern Jeden Buchstaben und einfach alles
    For i := 0 To High(MainLetterData) Do Begin
      f.read(j, sizeof(j));
      setlength(MainLetterData[i], j);
      // Laden der Datensätze
      For j := 0 To high(MainLetterData[i]) Do Begin
        f.read(w, sizeof(w)); // Breite
        f.read(h, sizeof(H)); // Höhe
        setlength(MainLetterData[i, j], w, h);
        For h := 0 To high(MainLetterData[i, j, 0]) Do Begin
          For w := 0 To trunc(high(MainLetterData[i, j]) / 8) Do Begin
            f.read(b, sizeof(b));
            For k := 0 To 7 Do
              If (w * 8 + k) <= high(MainLetterData[i, j]) Then
                // Das Jeweils Richtige Bit Auslesen
                MainLetterData[i, j, w * 8 + k, h] := ((b Shr k) And 1) = 1;
          End;
        End;
      End;
    End;
    f.free;
  End
  Else Begin
    For i := 0 To High(MainLetterData) Do
      setlength(MainLetterData[i], 0);
  End;
End;

Procedure SaveDynArr(Const f: TStream; Data: TBoolArray);
Var
  w, h, i, j, k: Integer;
  b: Byte;
Begin
  w := high(Data) + 1;
  h := High(Data[0]) + 1;
  // Zum Glück ist Data immer Rechteckig
  f.write(w, sizeof(w));
  f.write(h, sizeof(h));
  // Da wir die Breite Packen wirds etwas umständlich *g*
  For j := 0 To High(Data[0]) Do Begin // Über alle y - Werte
    For i := 0 To trunc(high(Data) / 8) Do Begin
      b := 0;
      For k := 0 To 7 Do
        // Das Letze Byte mus nicht unbedingt voll sein.
        If (i * 8 + k) <= High(Data) Then
          b := b + ord(Data[i * 8 + k, j]) Shl k;
      f.write(b, sizeof(b));
    End;
  End;
End;

Procedure SaveLetterData;
Var
  f: TFilestream;
  i, j: Integer;
Begin
  f := TFileStream.create(IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'Letters.dat', fmcreate Or fmopenwrite);
  // Wir Speichern Jeden Buchstaben und einfach alles
  For i := 0 To High(MainLetterData) Do Begin
    // f.write(i, sizeof(i)); // Als 1. Die Nummer des Buchstabens <-- Redundant
    j := High(MainLetterData[i]) + 1; // Dann die Anzahl der Elemente des Buchstabens
    f.write(j, sizeof(j));
    // Dann Alle Datensätze des Jeweiligen Buchstabens
    For j := 0 To High(MainLetterData[i]) Do Begin
      SaveDynArr(f, MainLetterData[i, j]);
    End;
  End;
  f.free;
End;
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat