Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi set of integer? (https://www.delphipraxis.net/20286-set-integer.html)

Skiron 15. Apr 2004 17:00


set of integer?
 
ich bin seit kurzem auf folgendes gestoßen
Delphi-Quellcode:
...
var
  h, h2: TShiftState;
begin
  h := [ssShift, ssAlt];
  h2 := h * [ssAlt];
...
bringen tut mir das ganze dass nur die in h2 drinnen stehen, welche in beiden Arrays vorhanden sind.

nun hab ich 2 Arrays, gefüllt mit integer, und muss alle raushauen, welche nur in einem Array drinnen sind. Nun klappt das aber nicht, da ich die beiden arrays nicht multiplizieren kann. Muss ich jetzt selber ausmisten oder gibs doch noch irgendwie eine möglichkeit, diesen "Trick" zu verwenden?

ich hab nun set of integer probiert, welches auch nicht geht
(hab mir gedacht, weil TShiftState auf set of ist)

sakura 15. Apr 2004 17:13

Re: set of integer?
 
Zitat:

Zitat von Skiron
Muss ich jetzt selber ausmisten oder gibs doch noch irgendwie eine möglichkeit, diesen "Trick" zu verwenden?

Das "ausmisten" :mrgreen: geht nur bei Sets, bei Arrays musst Du selber Hand anlegen ;)

...:cat:...

shmia 15. Apr 2004 17:19

Re: set of integer?
 
Ein set of char benötigt im Speicher 256 bit = 32 Bytes.
Dies ist das grösst mögliche set, dass von Pascal oder Delphi unterstützt wird.
Ein set of integer würde 2^32 bits = 512 MB im Speicher verbrauchen;
das wäre doch etwas heftig. :shock:

Skiron 15. Apr 2004 17:23

Re: set of integer?
 
Zitat:

Zitat von shmia
Ein set of integer würde 2^32 bits = 512 MB im Speicher verbrauchen;
das wäre doch etwas heftig

Stimmt, irgendwie auch richtig
Vielleicht akzeptiert deshalb delphi maximal 256 Elemente in einem set

Christian Seehase 15. Apr 2004 17:26

Re: set of integer?
 
Moin Shmia,

Zitat:

Zitat von shmia
Ein set of char benötigt im Speicher 256 bit = 32 Bytes.

woher hast Du denn das?

Eine Menge kann aus maximal 256 Elemente bestehen deren Wert zwischen 0 und 255 liegen muss, also belegt so ein Set maximal 256 Byte.

maximov 15. Apr 2004 17:49

Re: set of integer?
 
Zitat:

Zitat von Christian Seehase
Eine Menge kann aus maximal 256 Elemente bestehen deren Wert zwischen 0 und 255 liegen muss, also belegt so ein Set maximal 256 Byte.

Ja und nein! Da ein element einem bit entspricht ist die maximale grösse eben doch 32 byte, oder 256 bit. Das ist ja auch logisch, da ein element in einem set ja immer nur true oder false sein kann und nicht von 0 bis 256 :wink:

Das ganze kann man leicht testen, indem man ein set (mit 8 elemeten) zu einem byte casted und dann genau die binäre entsprechung haben sollte (habs mal getestet).

sakura 15. Apr 2004 17:50

Re: set of integer?
 
Zitat:

Zitat von Christian Seehase
woher hast Du denn das?

Ist doch eigentlich egal, oder; Hauptsache korrekt :mrgreen:

Delphi-Quellcode:
type
  TSet = set of Byte;

procedure TForm1.Button1Click(Sender: TObject);
var
  VSet: TSet;
begin
  ShowMessage(IntToStr(SizeOf(TSet)));
  ShowMessage(IntToStr(SizeOf(VSet)));
end;
Beide Messageboxen sagen 32 ;)

...:cat:...

sakura 15. Apr 2004 17:52

Re: set of integer?
 
Zitat:

Zitat von Christian Seehase
Eine Menge kann aus maximal 256 Elemente bestehen deren Wert zwischen 0 und 255 liegen muss, also belegt so ein Set maximal 256 Byte.

Noch mehr Theorie - deren Werte sind zwar von 0 bis 255, aber im Set unter Delphi immer mit 0 startend durchnummeriert. Damit ist klar, daß Bits ausreichen, um das Vorhandensein eines Wertes festzustellen. Ein Wert kann ja auch nur entweder gar nicht oder genau einmal vorkommen - damit reicht ein einzelnes Bit weiterhin ;)

...:cat:...

shmia 15. Apr 2004 17:52

Re: set of integer?
 
Zitat:

Zitat von Christian Seehase
Zitat:

Zitat von shmia
Ein set of char benötigt im Speicher 256 bit = 32 Bytes.

woher hast Du denn das?
Eine Menge kann aus maximal 256 Elemente bestehen deren Wert zwischen 0 und 255 liegen muss, also belegt so ein Set maximal 256 Byte.

Zum Speichern der Information, ob ein Element in einer Menge enthalten ist oder nicht,
wird lediglich ein Bit benötigt.
Die Position des Bits gibt an, welches Element gesetzt ist.

Beispiel:

Delphi-Quellcode:
type
TFarben = (rot, gruen, blau); // Aufzählungstyp mit 3 Elementen (intern als 0-2 gespeichert)

TFarbenSet = Set of TFarben;
// für 3 Elemente werden 3 Bit benötigt; es wird auf die nächste Byte- oder Wortgrenze aufgerundet
// sizeof(TFarbenSet) gibt Auskunft
var
   farben, farben2 : TFarbenSet;
begin
   farben := [];  // wird intern als 0b00000000 gespeichert
   farben := [gruen, blau, rot]; // wird intern als 0b00000111 gespeichert
   farben2 := [rot]; // wird intern als 0b00000001 gespeichert

   farben := farben + farben2; // intern wird 0b00000111 OR 0b00000001 berechnet

   if blau in farben then ;  // intern wird berechnet: (farben AND 0b00000010) <> 0

maximov 15. Apr 2004 17:56

Re: set of integer?
 
Sets sind halt nur eine elegante delphi kapselung für bit-flags und bit-masken! Genau das gleiche kann man auch AND, OR, SHL, etc. und cardinal typen erreichen, nur dann wär man auf 4 byte begrenzt!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:19 Uhr.
Seite 1 von 2  1 2      

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