AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Einem Set einen Enum zuweisen?

Ein Thema von Glados · begonnen am 27. Aug 2017 · letzter Beitrag vom 28. Aug 2017
Antwort Antwort
Seite 2 von 3     12 3      
Glados
(Gast)

n/a Beiträge
 
#11

AW: Einem Set einen Enum zuweisen?

  Alt 27. Aug 2017, 12:49
Jetzt werden aber Spezialitäten hier ausgepackt
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#12

AW: Einem Set einen Enum zuweisen?

  Alt 27. Aug 2017, 12:54
Hmmmm, war mir sicher, dass es sorum auch mal ging.
Auch nicht wirklich:

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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

AW: Einem Set einen Enum zuweisen?

  Alt 27. Aug 2017, 13:51
Assert(cnt = SizeOf(enum) * 8, 'Klappt doch!');
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Einem Set einen Enum zuweisen?

  Alt 27. Aug 2017, 14:24
Das ist noch besser. Ich hatte es bis gerade eben noch so (was wohl nicht gut ist)
Delphi-Quellcode:
const
  cDataSetAll: TDataSet = [tdHouse, tdCar];
Im Sinne von All ist die von Uwe vorgeschlagene Variante besser. Meistens benutze ich aber eher funktionelle Bezeichnungen bei diesen Konstanten um auszudrücken was ich mit dem Setzen dieser Werte bewirke.
Aber auch das ist natürlich nicht immer sinnvoll.

Beide Varianten haben je nach Kontext ihre Vorteile.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#15

AW: Einem Set einen Enum zuweisen?

  Alt 28. Aug 2017, 07:54
Zitat:
aDataSet := TDataSet(-1); hier sind nun alle deine ENUMs gesetzt und auch der freie Speicher, da das SET ja auf die Größe des nächstgrößeren Datentypen für die Speicherung "aufgerundet" wurde (Byte, Word, LongWord oder UInt64).
Nur mal zur Klärung was "set of" eigentlich ist:
Ich würde das als Bitfeld bezeichen, aber naja, Pascal eben ...
Oder sehe ich das falsch ?

Zitat:
Mengentypen

Eine Menge setzt sich aus mehreren Werten desselben ordinalen Typs zusammen. Die Werte haben keine feste Reihenfolge. Wenn ein Wert in einer Menge doppelt vorkommt, hat jedes Vorkommen dieselbe Bedeutung.

Der Bereich eines Mengentyps ist die Potenzmenge eines bestimmten Ordinaltyps, der als Basistyp bezeichnet wird. Die möglichen Werte eines Mengentyps sind Teilmengen des Basistyps, einschließlich der leeren Menge. Der Basistyp darf aus maximal 256 Werten bestehen. Die Ordinalpositionen der Werte müssen zwischen 0 und 255 liegen. Alle Konstruktionen der Form:
Das steht so im DocWiki, kann es denn jetzt größer als 8-Bit werden, oder nicht ?

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#16

AW: Einem Set einen Enum zuweisen?

  Alt 28. Aug 2017, 09:43
Das steht so im DocWiki, kann es denn jetzt größer als 8-Bit werden, oder nicht ?
Na klar, steht da doch! Bis 256 Elemente sind erlaubt, solange deren Ordinalwerte im Bereich 0..255 liegen. Der Speicherbereich eines Set wird dann eben zwischen 1 und 32 Byte angepasst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#17

AW: Einem Set einen Enum zuweisen?

  Alt 28. Aug 2017, 09:58
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:
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)
Ich habe mir die Interna nicht angesehen, deshalb die blöde Frage.
Das es bis 32-Bit wächst steht da ja nicht explizit.
Meine Vermutung wäre 2.).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#18

AW: Einem Set einen Enum zuweisen?

  Alt 28. Aug 2017, 10:45
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 {$MinEnumSize x} ), bei Verwendung des IN-Operators kann man davon aber nur 0-255 abfragen.

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
https://en.wikipedia.org/wiki/TEST_(x86_instruction)
$2B or not $2B

Geändert von himitsu (28. Aug 2017 um 11:15 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#19

AW: Einem Set einen Enum zuweisen?

  Alt 28. Aug 2017, 11:08
Aha, dankesehr himitsu.

Wieder was dazugelernt

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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#20

AW: Einem Set einen Enum zuweisen?

  Alt 28. Aug 2017, 12:38
Und weil die Doku das irgendwie nicht klar beschreibt (oder ich hatte es nur noch nicht gefunden).
http://docwiki.embarcadero.com/RADSt...i)#Mengentypen

Zitat:
Eine Menge ist ein Array von Bits. Jedes Bit zeigt an, ob ein Element in der Menge enthalten ist oder nicht. Da die maximale Anzahl der Elemente einer Menge 256 beträgt, belegt eine Menge nie mehr als 32 Byte.
Zitat:
Der Compiler speichert Mengen nach Möglichkeit in CPU-Registern. Eine Menge bleibt jedoch immer im Speicher, wenn sie größer als der plattformabhängige Integertyp ist oder im Quelltext des Programms auf die Adresse der Menge zugegriffen wird.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 00:03 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