![]() |
AW: Einem Set einen Enum zuweisen?
Jetzt werden aber Spezialitäten hier ausgepackt :P
|
AW: Einem Set einen Enum zuweisen?
Zitat:
Delphi-Quellcode:
var
cnt: Integer; dataSet: TDataSet; enum: TDataEnum; begin Byte(dataSet) := $FF; cnt := 0; for enum in dataSet do begin Inc(cnt); end; Assert(cnt = 2, 'Klappt nicht!'); end; |
AW: Einem Set einen Enum zuweisen?
Delphi-Quellcode:
:stupid:
Assert(cnt = SizeOf(enum) * 8, 'Klappt doch!');
|
AW: Einem Set einen Enum zuweisen?
Zitat:
Aber auch das ist natürlich nicht immer sinnvoll. Beide Varianten haben je nach Kontext ihre Vorteile. |
AW: Einem Set einen Enum zuweisen?
Zitat:
Ich würde das als Bitfeld bezeichen, aber naja, Pascal eben ... Oder sehe ich das falsch ? Zitat:
Rollo |
AW: Einem Set einen Enum zuweisen?
Zitat:
|
AW: Einem Set einen Enum zuweisen?
Meine Frage war ja wie sich 256 Werte intern speichern, reicht da EIN Bit aus,
also wird die Info als Bitfeld gespeichert ? Oder wird das als Array angelegt ?
Delphi-Quellcode:
Ich habe mir die Interna nicht angesehen, deshalb die blöde Frage.
type
enum (eins=1, zwei=2, ende=256); //1.) Wird das irgendwie bitmässig gespeichert im set ? $01 = eins $02 = zwei $04 = drei $08 = vier ... $80 = acht $80000000...00000 // 256-Bit ? // So funktioniert es wohl nicht, sondern (ich vermute) // 2.) eher wie ein Byte-Array (oder Integer-Array) byteArr : array[0..255]; byteArr[0] = eins byteArr[1] = zwei byteArr[255] = ende // 1.) Im ersten Fall würde es intern als BIT gespeichert (wäre Speichereffizient), // 2.) im zweiten Fall als BYTE (wäre Speicher-Verschwendung, aber simpler zu implementieren) Das es bis 32-Bit wächst steht da ja nicht explizit. Meine Vermutung wäre 2.). |
AW: Einem Set einen Enum zuweisen?
Das mit den 0-255 hast du falsch verstanden.
1-Byte wäre es, wenn es sich auf ENUMs bezieht, aber die können bis 64 Bit groß werden (0-255=Byte, 256-65.535=Word, ...=LargeWord und auch abhängig von
Delphi-Quellcode:
), bei Verwendung des IN-Operators kann man davon aber nur 0-255 abfragen.
{$MinEnumSize x}
Der Compiler nutzt für SETs aber beim IN einen Assemblerbefehl, der nur eine Bit-Adressierung mit einem Byte unterstützt, weswegen SETs auf 256 Bits (Werte/ENUMs) unterstützt werden, also bis zu 32 Bytes. Das ist auch der Grund, warum man bei WideChar kein IN verwenden kann, obwohl man das im Compiler auch hätte bugfixen können. (selber eine Prüfung implementieren, bzw. bei der Prüfung das unterde Byte des Index über den schon verwendeten ASM-Befehl und die höheren Byte als Speicheroffest i*32, vorallem da dieser ASM-Befehl nicht gerade schnell ist und man das mit einem ByteOffest+Shift+AND hätte womöglich schneller prüfen können)
Code:
Unit6.pas.29: Exclude(A, 'b');
004AB648 8065E4FB and byte ptr [ebp-$1c],$fb Unit6.pas.30: Include(A, 'b'); 004AB64C 804DE404 or byte ptr [ebp-$1c],$04 Unit6.pas.31: if 'b' in a then ; 004AB650 F645E404 test byte ptr [ebp-$1c],$04 004AB654 7407 jz $004AB656 ![]() |
AW: Einem Set einen Enum zuweisen?
Aha, dankesehr himitsu.
Wieder was dazugelernt :thumb: Ich benutzte sets eigentlich recht sparsam, deswegen habe ich mir das auch noch nicht näher angesehen. Und weil die Doku das irgendwie nicht klar beschreibt (oder ich hatte es nur noch nicht gefunden). Rollo |
AW: Einem Set einen Enum zuweisen?
Zitat:
![]() Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr. |
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 by Thomas Breitkreuz