AGB  ·  Datenschutz  ·  Impressum  







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

Größe von SETs festlegen

Ein Thema von himitsu · begonnen am 6. Mai 2008 · letzter Beitrag vom 9. Mär 2024
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von himitsu
himitsu

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

Größe von SETs festlegen

  Alt 6. Mai 2008, 08:53
Mit {$MINENUMSIZE x} / {$Zx} kann man ja dir Größe von "enumerated types" festlegen,

Gibt es da auch eine Möglichkeit dieses für SETs zu machen?


in C sind diese ja Integer-groß, aber in Delphi standardmäßig so klein wie möglich


Code:
enum tagLOCKTYPE
  {  LOCK_WRITE    = 1,
     LOCK_EXCLUSIVE = 2,
     LOCK_ONLYONCE = 4
  }  LOCKTYPE;
so geht es zwar, aber dann sind ide Konstanten vom Typ getrennt
Delphi-Quellcode:
const
  LOCK_WRITE = 1;
  LOCK_EXCLUSIVE = 2;
  LOCK_ONLYONCE = 4;

type
  LOCKTYPE = Type Integer;
und dises geht auch, aber es sieht irgendwie blöd aus
Delphi-Quellcode:
type
  LOCKTYPE = Set (
    LOCK_WRITE = 1;
    LOCK_EXCLUSIVE = 2;
    LOCK_ONLYONCE = 4;
    _locktype_align = 31);
$2B or not $2B
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Größe von Set's festlegen

  Alt 6. Mai 2008, 09:35
Wieso sollte ein Kompiler die Größe einer Menge *nicht* so klein wie möglich machen? Gerade eine typenstrenge Sprache wie Pascal ist da sehr genau.

Gottseidank gibt es aber sowas wie variant records, wenn Du also partout möchtest, das deine Menge z.B. 8 bytes hat, dann deklariere einen variant record datentyp:

Delphi-Quellcode:
TMySet = Record
  Case Boolean Of
    False : (M : TMySet);
    True : (Dummy : Array [0..7] Of Byte);
  End;
P.S.: Die Mehrzahl von SET ist SETS und *nicht* SET's. Das Apostroph ist ein Auslassungszeichen, und hier wird nichts ausgelassen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Größe von Set's festlegen

  Alt 6. Mai 2008, 09:49
Zitat von alzaimar:
Wieso sollte ein Kompiler die Größe einer Menge *nicht* so klein wie möglich machen? Gerade eine typenstrenge Sprache wie Pascal ist da sehr genau.
Weil ich kompatibel zur WinAPI sein muß, in welcher die SETS 4 Byte klein sind?

Und das mit dem record geht nicht, da dann die Variable ein Record ist und kein SET.
Als Parameter in einer Funktion kann man dann kein SET mehr verwenden/setzen
> [a, b, c]

Zitat von alzaimar:
P.S.: Die Mehrzahl von SET ist SETS und *nicht* SET's. Das Apostroph ist ein Auslassungszeichen, und hier wird nichts ausgelassen.
da hab ich mich wohl von wem falsch verleiten lassen
Zitat von Delphi-OH:
provided the upper and lower bounds of the set's base type have ordinal values
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Größe von SETs festlegen

  Alt 6. Mai 2008, 10:11
Dein gewünschtes Feature gibt es in Delphi nicht (in FPC {$PACKSET x}).
Du kannst die entsprechende Aufzählung um Dummies erweitern, oder das größtmögliche Aufzählungsmitglied (31) als einzigen Dummy definieren (für nicht fortlaufende oder nicht mit 0 beginnende Aufzählungen wird allerdings keine RTTI-Information erzeugt!).

ps: siehe http://www.delphipraxis.net/internal...=882557#882557

pps:
Zitat von himitsu:
und dises geht auch, aber es sieht irgendwie blöd aus
Delphi-Quellcode:
type
  LOCKTYPE = Set (
    LOCK_WRITE = 1;
    LOCK_EXCLUSIVE = 2;
    LOCK_ONLYONCE = 4;
    _locktype_align = 31);
Das ist nicht korrekt, es müsste so aussehen:
Delphi-Quellcode:
type
  PLockType = ^TLockType;
  TLockType = set of (
    LockTypeWrite, // (Bit) 0
    LockTypeExclusive, // (Bit) 1
    LockTypeOnlyOnce, // (Bit) 2
    LockTypeForceDWORD = 31
  );
const
  LOCK_WRITE = DWORD(1 shl DWORD(LockTypeWrite));
  LOCK_EXCLUSIVE = DWORD(1 shl DWORD(LockTypeExclusive));
  LOCK_ONLYONCE = DWORD(1 shl DWORD(LockTypeOnlyOnce));
Die Ordinalwerte von LockTypeXxx und LOCK_Xxx sind unterschiedlich! (bis aufs erste
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Größe von Set's festlegen

  Alt 6. Mai 2008, 10:25
[quote="himitsu"]
Zitat von alzaimar:
Und das mit dem record geht nicht, da dann die Variable ein Record ist und kein SET.Als Parameter in einer Funktion kann man dann kein SET mehr verwenden/setzen ...> [a, b, c]
Äh...
MyRecord.MySet := [1,2,3] Oder meinst du als Parameter? Ja, das wäre blöd, aber Du kannst Dir ja mit einer dreckigen 'absolute' direktive helfen, aber dafür werden wir hier bestimmt gesteinigt.
Delphi-Quellcode:
Function Foobar (MySetParam : TMySet) : TBarFoo;:
Var
  MySetParamEx : TMyRecord Absolute MySetParam;

Begin
  ....
End;
Oder eben nicht mit Sets sondern mit Bitoperationen. Sets sind sowieso leider bedauerlicherweise fast nie nicht zu gebrauchen. Wir hatten mit -hoika glaube ich- eine sehr interessante und hitzige Diskussion über Sets im allgemeinen.

Wenn Du bitkompatibel mit einer API-Vorgabe sein willst, würde eh auf die Sets verzichten, da die Implementierung ja maschinenabhängig sein könnte bzw. Dir keiner garantiert, das CodeGear dafür in Zukunft auch Bits genauso verwendet.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Größe von SETs festlegen

  Alt 6. Mai 2008, 10:48
jupp, auch als Parameter

und Absolute geht nur bei gleichgroßen Typen ... bringt also nichts


Und ja, sie ist Maschienen- nja, eher Windows-API-abhängig
SizeOf(Set) = SizeOf(Integer) hab es jetzt doch anders gelöst

in den WindowsHeaderFiles ist es als Record definiert, daher wollte ich es möglichst auch so definieren

in Delphi hat man die erste Variante mit Typ+Konstanten verbaut

und ich mach jetzt erstmal
Delphi-Quellcode:
type LOCKTYPE = Set (LOCK_WRITE=1; ...; _locktype_align=SET_HIGH_BIT);

// und (INT_2..INT_8 sind private Definitionen aus FInclude.inc)
type SET_HIGH_BIT = {$IFDEF INT_2}15{$ENDIF} {$IFDEF INT_4}31{$ENDIF} {$IFDEF INT_8}63{$ENDIF};

nja, Bit-Klassen/Records hab ich schon genug
> http://www.delphipraxis.net/internal...=879295#879295 > FType.pas



Zitat:
Das ist nicht korrekt, es müsste so aussehen:
schau ich mir nochma an ... schon nett, diese Unterschiede in den Sprachen

aber dann ließe sich ja etwas wie STGTY nicht als SET übersetzen
Code:
typedef
enum tagSTGTY
    {   STGTY_STORAGE   = 1,
   STGTY_STREAM   = 2,
   STGTY_LOCKBYTES   = 3,
   STGTY_PROPERTY   = 4
    }    STGTY;

typedef
enum tagSTREAM_SEEK
    {   STREAM_SEEK_SET   = 0,
   STREAM_SEEK_CUR   = 1,
   STREAM_SEEK_END   = 2
    }    STREAM_SEEK;

typedef
enum tagLOCKTYPE
   {   LOCK_WRITE   = 1,
   LOCK_EXCLUSIVE   = 2,
   LOCK_ONLYONCE   = 4
    }    LOCKTYPE;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Größe von SETs festlegen

  Alt 6. Mai 2008, 10:58
Zitat von himitsu:
aber dann ließe sich ja etwas wie STGTY nicht als SET übersetzen
Jupp, genau das ist die Stelle an der Sets keine Vorteile mehr bringen und eher für mehr Arbeit beim Entwickler sorgen.
Aber STGTY ist auch kein "Set", sondern eine Aufzählung
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Größe von SETs festlegen

  Alt 6. Mai 2008, 11:12
irgendwie raucht grad mein Köpfchen ... nach meheren Wochen fast nur noch im PSDK, den Headerfiles und meiner Übersetzung unterwegs ... vorallem wenn MSDN, PSDK und die HeaderFiles was Unterschiedliches sagen
http://fnse.de/S01/0AT.gif

also geht ich wohl doch erstmal wieder zu der "guten" alten Typ-Konstante-Variante über
Delphi-Quellcode:
Const
  // LOCKTYPE values
  LOCK_WRITE = 1;
  LOCK_EXCLUSIVE = 2;
  LOCK_ONLYONCE = 4;

Type
  LOCKTYPE = Type _INT;



@Daniel: wir brauchen noch ein KopfRauchSmilie, weil besoffen bin ich noch nicht
$2B or not $2B
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#9

Re: Größe von SETs festlegen

  Alt 6. Mai 2008, 11:29
aber sag mal, weshalb willste unbedingt den typ vergrössern? das sollte doch der compiler bei der übergabe selbst anpassen und für den prozessor, ist es immer 'n INT breit . also bei 'ner 8 BIT CPU 8 bit, bei 'ner 16'er 16 BIT, 32'er 32 Bit und bei 'ner 64'er eben 64 Bit. Die aufrufkonventionen sorgen dann schon dafür, dass du bei 'ner 64 CPU dann auch die richtigen 32 Bit wieder zurückbekommst ...

<HTH> GG
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Größe von SETs festlegen

  Alt 6. Mai 2008, 11:33
Zitat von himitsu:
also geht ich wohl doch erstmal wieder zu der "guten" alten Typ-Konstante-Variante über
Das dürfte wohl am einfachsten und flexibelsten sein

Ich würde es persönlich anders schreiben, um die Konstanten im Quelltext zu "dokumentieren":
Delphi-Quellcode:
type
  PLockType = ^TLockType;
  TLockType = type LongInt; // TEnumInt
const
  LOCK_WRITE = TLockType(1);
  LOCK_EXCLUSIVE = TLockType(2);
  LOCK_ONLYONCE = TLockType(4);
Man _könnte_ ein Set TLockTypes deklarieren (für TStatStg.grfLocksSupported)... doch
1) würde man dann LOCK_Xxx nicht mehr definieren, damit der nutzende Entwickler nicht verwirrt wird (durch andere Ordinalwerte) und gar nicht erst auf die Idee kommt LOCK_Xxx im Sinne von Bitmasken zu verwenden,
2) müsste man alle Funktionen die _einen_ Locktyp erwarten dennoch mit einem Set-Parameter definieren (da es LOCK_Xxx nicht mehr gibt) - was den nutzenden Entwickler noch mehr verwirrt, weil er laut Deklaration davon ausgehen muss, dass man 'mehrere' Locktypen übergeben kann (was nicht der Fall ist).

Kurz, lass es bei den Konstanten
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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