Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherung von Sets... ?!? (https://www.delphipraxis.net/41242-speicherung-von-sets.html)

Kedariodakon 28. Feb 2005 16:01

Re: Speicherung von Sets... ?!?
 
Zitat:

Zitat von maximov
Bei den wochentagen ist es evtl nicht wichtig, weil keine mehr dazu kommen können, aber in einem anderen set könnte es passieren, das elemente eingefügt werden. Läd man die daten dann wieder binär, haben element ihren wert verloren, da alles verrutscht ist. Wenn allerdings jedes element eindeutig benannt ist, so ist dies kein problem. Deshalb auch RTTI, denn dort die namen der elemente :wink:

Da hättest du recht ^^
Aber wie du schon sagtest, bei wochentagen ist die chance nicht sehr hoch, dass da einer dazukommt, bzw gestrichen wird.
Und falls doch muß das Programm eh wieder neu kompiliert werden, weil wenn nicht es bei einer BÜcherverbre...*hüsst* Programmverbrennung vernichtet würde :zwinker:


Zitat:

Zitat von maximov
@DFM-Streaming: DFM dateien? schon mal gesehen :mrgreen: ...da werdenn auch sets gespeichert, die du zB. im OI eingestellt hast.

jap schon gesehen, hatte dazu schon was geschrieben...
Zitat:

Zitat von Kedariodakon
Edit: DFM-Streaming-system = Das speichern/laden von Published OBjectPropertys als String. Richtig?

Bye

shmia 28. Feb 2005 16:06

Re: Speicherung von Sets... ?!?
 
Kleiner Chrash-Kurs über Mengen (Sets):
* ein Set kann maximal 256 Elemente speichern
deshalb ist z.B. ein Set of Integer nicht möglich.

Ein Set benötigt folgenden Speicherplatz
Code:
 1 bis 8 Elemente => 1 Byte
 9 bis 16 Elemente => 2 Byte
17 bis 32 Elemente => 4 Byte
33 bis 39 Elemente => 5 Byte
40 bis 48 Elemente => 6 Byte
49 bis 56 Elemente => 7 Byte
57 bis 64 Elemente => 8 Byte
65 bis 72 Elemente => 9 Byte
...
   bis 256 Elemente => 16 Byte
Ob ein Element in einem Set enthalten ist oder nicht, wird bitcodiert.
Das 1. Element entspricht dem niederwertigsten Bit (LSB).

Das Casten eines Set in einen Integer und zurück ist nur bis max. 32 Elemente möglich.

maximov 28. Feb 2005 16:10

Re: Speicherung von Sets... ?!?
 
Zitat:

Zitat von shmia
...
Das Casten eines Set in einen Integer und zurück ist nur bis max. 32 Elemente möglich.

Das ist selbstredend. Nur was macht die VCL wenn es doch mal mehr sein sollten? Denn StringToSet ist ja wie folgst deklariert:
Delphi-Quellcode:
function SetToString(PropInfo: PPropInfo; Value: Integer; Brackets: Boolean = False): string;
Heißt das, daß die VCL generell auf 32 bit sets beschränkt ist?

himitsu 28. Feb 2005 16:27

Re: Speicherung von Sets... ?!?
 
Also mann kann auch locker ein Set nach Array[0..7] of Byte / Array[0..3] of Word ... casten, dann hat man die vollen 256 Werte zur Verfügung




Derzeit aber ich ja an ein paar kleinen Units, wo es auch schon fertige Typen gibt, welche das umwandeln/casten solcher typen in andere und zurück vereinfacht...
ich weiß aber noch nicht wann ich genau fertig bin

Kedariodakon 28. Feb 2005 16:28

Re: Speicherung von Sets... ?!?
 
Zitat:

Zitat von shmia
ein Set kann maximal 256 Elemente speichern

Wo du es erwähst, steht auch in der oh wie ich seh :cyclops:
Zitat:

Zitat von shmia
Das Casten eines Set in einen Integer und zurück ist nur bis max. 32 Elemente möglich.

klingt logisch, da ja ein Integer nur 4 Byte Groß ist :zwinker:
Aber das hier Casten geht wusste ich noch nicht, gut zu wissen, dann hätte sich mein Wochentag speicherproblem gelöst :wink:

Dann erstmal danke für des Résumé :thumb:


Aber eine Frage ist immer noch offen, ist die SetVariable von sich aus schon so groß wie das volle Set einnimmt? :duck:


Bye

shmia 28. Feb 2005 16:30

Re: Speicherung von Sets... ?!?
 
Zitat:

Zitat von maximov
Nur was macht die VCL wenn es doch mal mehr sein sollten? Denn StringToSet ist ja wie folgst deklariert:
Delphi-Quellcode:
function SetToString(PropInfo: PPropInfo; Value: Integer; Brackets: Boolean = False): string;
Heißt das, daß die VCL generell auf 32 bit sets beschränkt ist?

Ich denke, dass 32 Elemente für die VCL das Limit ist. :pale:
Delphi-Quellcode:
  // aus der Unit SysUtils kopiert:
  // Ein Set mit 32 Elementen (0..31)
  TIntegerSet = set of 0..SizeOf(Integer) * 8 - 1;
Und in der Unit TypInfo wird so damit gearbeitet:
Delphi-Quellcode:
function GetSetProp(Instance: TObject; PropInfo: PPropInfo;
  Brackets: Boolean): string;
var
  S: TIntegerSet;        // 4 Bytes
  ...
begin
  Integer(S) := GetOrdProp(Instance, PropInfo);
  ...
  for I := 0 to SizeOf(Integer) * 8 - 1 do  // <= Schleife von 0 bis 31
Das gilt bei Delphi 5; ob bei höheren Version mehr als 32 Elemente möglich kann ich nicht sagen.

maximov 28. Feb 2005 16:41

Re: Speicherung von Sets... ?!?
 
Zitat:

Zitat von Kedariodakon
...
Aber eine Frage ist immer noch offen, ist die SetVariable von sich aus schon so groß wie das volle Set einnimmt? :duck:


Bye

JA. Ein bit nimmt ja auch nicht weniger platzt weg, wenn es false ist :mrgreen:

Kedariodakon 28. Feb 2005 16:51

Re: Speicherung von Sets... ?!?
 
Das mein ich jetzt nicht ^^

Angenommen ich habe ein typ TTest mit 32 Elementen, und bau daraus ein set namens TTests, nun erstelle ich eine Variable
Delphi-Quellcode:
var Settest: TTests;
.

nun mach ich folgendes:
Delphi-Quellcode:
Settest := [];
hat nun Settest eine größe von 4 Byte oder von 1 ?

Bye

himitsu 28. Feb 2005 16:56

Re: Speicherung von Sets... ?!?
 
Das set ist immer nur so groß, wie nötig

Größe in Byte = Aufrunden(Elemente / 8)

Aber es gibt auch eine Möglichkeit dem Set eine gewisse größe aufzuzwingen, entweder per Compilerschalter {$X-} / {$X+} oder {$X1}, {$X2}, {$X4} aber was für das X hinkomm , fällt mir gerade nicht ein (aber dafür ist ja die OH da ^^)


oder man gibt einfach dem letzten element eine Position

... = Set of (aaa, bbb, ccc, ddd=31); // hier ist dann das Set 32 Bit/4 Byte groß

PS: auf diese Weise kann man auch allen elementen selber nummern verzeilen :zwinker:

maximov 28. Feb 2005 17:52

Re: Speicherung von Sets... ?!?
 
Zitat:

Zitat von Kedariodakon
Das mein ich jetzt nicht ^^

Angenommen ich habe ein typ TTest mit 32 Elementen, und bau daraus ein set namens TTests, nun erstelle ich eine Variable
Delphi-Quellcode:
var Settest: TTests;
.

nun mach ich folgendes:
Delphi-Quellcode:
Settest := [];
hat nun Settest eine größe von 4 Byte oder von 1 ?

Bye

Anscheinend meintest du das doch! Es spielt keine rolle was in dem set steht. Es sind immer alle elemente (bits) enthalten, sie müssen aber nicht zwangsläufig gesetzt sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz