AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Speichereffizientes Speichern von Boolean Array's
Thema durchsuchen
Ansicht
Themen-Optionen

Speichereffizientes Speichern von Boolean Array's

Ein Thema von Corpsman · begonnen am 25. Feb 2008 · letzter Beitrag vom 26. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Corpsman
Corpsman

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

Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 14:59
Hallo alle miteinander ,

ich hab hier ein kleines Speicherproblem

also ich habe mir foglende Variable gebaut:
Delphi-Quellcode:

Type

  TBoolArray = Array Of Array Of Boolean;

Var
  MainLetterData: Array[0..25 + 10] Of Array Of TBoolArray;
Wie man sehen kann ist das ein 4 Dim Array bei dem 3 Dims Dynamisch sind.

Nun will ich dieses Monster Speichern und auch wieder Laden können.

Das Problem ist
Normalerweise wäre ich hergegangen und hätte die Dimension gespeichert und dann eben Zeile für Zeile

Das Problem ist aber wenn man Hergeht und ein Boolean Speichert braucht der ja jeder Bool ein Byte

Und dann ist mein Array 8 Mal Größer als eigentlich.

Weis mir nun jemand wie ich mittels Delphi Spezial Operationen das Array so speichern das der immer 8 Boolean zu einem Byte zusammenfasst ?

ACHTUNG !!

Wie man das von Hand macht weis ich, aber das ist mir eigentlich zu auffwendig, es geht hier also um die "Elegante" Lösung.

Mittels 1, 2 Befehlen.

Das man sich die Bytes zusammenshiften kann und das dann speichern kann ist Klar.
Uwe
My Sitewww.Corpsman.de

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

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 15:01
Anders geht´s aber nicht. Schreibe dir am besten eine Klasse, die das Gewünschte kapselt.

LG,
Xong
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

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

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 15:07
*würg*

damit sind alle Hoffnungen weg.

THX
Uwe
My Sitewww.Corpsman.de

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

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 15:11
Hey!
Da beginnt doch erst der Spaß! =)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 15:30
Delphi-Referenz durchsuchenTBits und Delphi-Referenz durchsuchenTObjectList für die zweite Dimension
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#6

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 18:40
TBits gibt es erst seit Delphi6. Corpsman arbeitet aber mit Delphi5.

Zudem gibt TBits keine Möglichkeit die Daten gepackt zu bekommen.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 19:23
Eigentlich ist das nicht so aufwändig. Du verwendest eben kein TBoolArray sondern eine Klasse, die das wie oben packt.
Delphi-Quellcode:
Type
  TByteArray = Array Of Byte;
  T4DimBoolArray = Class
  private
    fDim1, fDim2, fDim3, fDim4: Integer;
    fBytes: Array Of Byte;
    Function GetValue(i, j, k, l: Integer): Boolean;
    Procedure SetValue(i, j, k, l: Integer; Const Value: Boolean);
  public
    Constructor Create(dim1, dim2, dim3, dim4: Integer);
    Property Value[i, j, k, l: Integer]: Boolean read GetValue write SetValue;
    Property Bytes: TByteArray read fBytes;
  End;

Constructor T4DimBoolArray.Create(dim1, dim2, dim3, dim4: Integer);
Begin
  fDim1 := dim1;
  fDim2 := dim2;
  fDim3 := dim3;
  fDim4 := dim4;
  SetLength(fBytes, fDim1 * fDim2 * fDim3 * fDim4);
End;

Function T4DimBoolArray.GetValue(i, j, k, l: Integer): Boolean;
Var
  b: Integer;

Begin
  b := ((i * fDim1 + j) * fDim2 + k) * fDim3 + l;
  result := fBytes[b Div 8] And (1 Shl b Mod 8) <> 0;
End;

Procedure T4DimBoolArray.SetValue(i, j, k, l: Integer; Const Value: Boolean);
Var
  b, b1, b2: Integer;
  m: Byte;
Begin
  b := ((i * fDim1 + j) * fDim2 + k) * fDim3 + l;
  b1 := b Div 8;
  m := 1 Shl b Mod 8;
  If Value Then
    fBytes[b1] := fBytes Or m
  Else
    fBytes[b1] := fBytes And Not m;
End;
Ungetestet.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 19:42
Die Kernfrage bei dem ganzen sollte man aber nicht ausser Acht lassen: Macht es überhaupt Sinn? Mit heutigen Rechnern ist es in den allermeisten Fällen so, dass man sich einen geringen Platzvorteil (der heutzutage kaum noch ins Gewicht fällt) mit einem sehr viel größeren Performancenachteil erkauft. Sowas macht IMHO keinen Sinn. Ich habe in einem Projekt gerade erst aus genau diesem Grunde einen ganzen Stapel Arithmetik gegen Lookup-Tables ausgetauscht. Hauptspeichermehrbedarf schlappe 6 MB, dafür aber ein extremer Performancezuwachs von über 300% in den zeitkritischen Teilen.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 19:49
Wenn man es vernünftig anstellt, hat man keinen Performance-Nachteil. In TBits wird die Abfrage z.B. mit der Anweisung bt erledigt, was extrem schnell sein sollte.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Speichereffizientes Speichern von Boolean Array's

  Alt 25. Feb 2008, 20:08
Hallo Corpsman,

neben der von alzaimar vorgestellten Abbildung auf ein eindimensionales Array könntest du auch über die Verwendung von Mengen nachdenken, falls dich die Beschränkungen von Delphi (max. 256 Elemente pro Menge) nicht daran hindern:

Delphi-Quellcode:
type
  TFlag = 0..25 + 10;
var
  Flag : TFlag;
  Bytes : Integer;
  i, j : Integer;
  Data : array of array of array of set of TFlag;
begin
  SetLength (Data, 10, 20, 30);

  Flag := 4;

  // Setzen eines Flags
  Include (Data[0, 0, 0], Flag);

  // Löschen eines Flags
  Exclude (Data[0, 0, 0], Flag);

  // Abfragen eines Flags
  if (Flag in Data[0, 0, 0]) then ;

  with TFileStream.Create('data.bin', fmCreate) do
    try
      Bytes := Length(Data[0, 0]) * SizeOf(Data[0, 0, 0]);

      for i := 0 to High(Data) do
        for j := 0 to High(Data[i]) do
          Write (Data[i, j, 0], Bytes);
    finally
      Free;
    end;
end;
Den Code zum Speichern darfst du nur als einfaches Beispiel verstehen. In der Praxis wirst du die Dimension des Arrays speichern müssen, um die Daten wieder einlesen zu können.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz