Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
22. Aug 2020
Ja, mit Variablen (festen Typen als Array) funktioniert es,
mein Problem bei dieser Variante liegt in der Nutzbarkeit.
if m96 in then begin
// Nein
end else if m512 in then begin
// Ja
end;
Leider wird hier ein SET generiert, es wird wegen der Grenzen gemeckert und der Operator mit dem ARRAY wird garnicht erst gesucht.
Man müsste das Array somit erstmal erzwingen.
Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
22. Aug 2020
Weil das kein SET ist.
Beim oder wird nunmal implizit ein SET aus deinem ENUM generiert.
Schön wäre es, wenn ab einer gewissen Größe hier stattdessen das als ARRAY generiert würde (aber das geht leider "noch" nicht), bzw. auch bei Weniger ARRAY unterstützt wird, bei der Suche nach kompatiblen Funktionen.
Mit ORD wird nur der Wert des ENUMs in einen anderen ordinalen Typen "Integer"...
Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
22. Aug 2020
Doch, denn das nach dem IN ist ein SET.
TMenge kann intern Byte, Word oder LongWord sein, also bis 4 Millarden Werte enthalten,
aber als SET ist hier maximal Byte-ENUM erlaubt. (bis 256 Werte aka Bits = 32 Byte)
Man kann über eine Funktion das Set durch ein Array ersetzen, am Besten als OpenArray, um hier auch die direkte Angabe zu unterstützen.
if ContainsMenge(Menge, ) then ;
...
Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
25. Jul 2018
Der Compiler könnte es aber auch problemlos nativ bei einfachen Enum-Typen umsetzen, wenn man auf BT verzichtet.
Gut, BT EDX, AL (2-4 Byte) hat weniger Bytes, als irgendwas in der Richtung TEST LONG PTR EDX + , EAX and $1F (if LongBool(A and (i and $1F)) then 20+ Bytes), aber schneller ist es dennoch meistens nicht.
OK, ein volles 256er-ENUM ist auch nur 32 Byte groß und nur weniger wollen...
Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
25. Jul 2018
Ursprünglich bassiert der ENUM auf einem Set von Assemblerbefehlen, welche allerdings "sehr" suboptimal (lahmarschig) von praktisch allen CPU-Entwicklern umgesetzt sind.
Und diese Befehle kennen nunmal ausschließlich eine Byte-Adressierung.
https://en.wikipedia.org/wiki/Bit_Test
ABER SET ist nicht gleich SET.
Genauso, wie bei den Arrays, gibt es da Unterschiede wo etwas definiert ist....