![]() |
inkompatible Typen bei Mengen (Set)
Hallo
Ich habe folgende Menge definiert:
Delphi-Quellcode:
Nun möchte ich prüfen ob ein Integer einen Wert der Menge angenommen hat:
tMyMenge = set of(cEins,cHundert,cTausend);
Delphi-Quellcode:
Leider funktioniert das nicht. Der Compiler gibt folgende Fehlermeldung aus:
if (MyInteger in MyMenge) then...
Delphi-Quellcode:
Ich denke, irgendwie muss ich MyInteger in Enumeration casten... Geht das überhaupt? Wie?
Inkompatible Typen: 'Integer' und 'Enumeration'
Danke und Gruss Tom |
Re: inkompatible Typen bei Mengen (Set)
Moin Tom,
das ginge so
Delphi-Quellcode:
TMyMenge(MyInteger)
|
Re: inkompatible Typen bei Mengen (Set)
Oder, um sicherzustellen, daß Du nicht außerhalb des Bereiches liegst kannst Du auch mit
GetEnumName() bzw. GetEnumValue() arbeiten. Bis neulich ... |
Re: inkompatible Typen bei Mengen (Set)
Zitat:
Delphi-Quellcode:
aber das tut so nicht. Ich bekomme dann die Fehlermeldung:
if (tMyMenge(MyInteger) in MyMenge) then ...
Delphi-Quellcode:
@Grendel:
Ungültige Typumwandlung
Zitat:
Danke und Gruss Tom |
Re: inkompatible Typen bei Mengen (Set)
Probier es mal so:
Delphi-Quellcode:
TMyEnum = (cEins, cHundert, cTausend);
TMySet = set of TMyEnum; [..] if TMyEnum(MyInteger) in MySet then |
Re: inkompatible Typen bei Mengen (Set)
Das sieht alles schwer nach Spekulation aus. 8) Du verwechselst einen Aufzählungstyp mit einem integer. So gehts aber nicht und darüber hat der Compiler zurecht gemeckert.
Was soll das :
Delphi-Quellcode:
bei 3 möglichen Varianten ? :shock:
in
Benutze ein CASE und fertig. Guck Dir die Funktion Ord an. Wahrscheinlich liegt der Fehler aber eher daran, daß der Typ zwar deklariert ist, aber keine Variable. |
Re: inkompatible Typen bei Mengen (Set)
@Hansa: wieso spekulation? wieso kein in? der code von kabarakaback funktioniert doch einwandfrei.
|
Re: inkompatible Typen bei Mengen (Set)
naja, ein Integer ist eben kein Enum, das ist wie Äpfel und Birnen. Ein "Set of" ist ein Byte groß und ein Integer ist 4 Byte groß. Und der "in" Operator funktioniert nur bei Typen die 1 Byte groß sind denn auf welches Byte soll sonst die BitKombination getestet werden?
|
Re: inkompatible Typen bei Mengen (Set)
ok, man sollte natürlich davon ausgehen, dass der integer auch gescheit gefüllt ist, d.h. dass das richtige der 4 bytes mit einem korrekten wert gefüllt ist. das sollte z.b. ja auch so gehen:
Code:
über den sinn von sowas lässt sich natürlich streiten (ich würde es z.b. niemals so machen), aber es ollte doch funktionieren (hab es allerdings nicht getestet).
type TMyEnum = (cEins, cHundert, cTausend);
var i: Integer; s: set of TMyEnum; begin i := Integer(cEins); s := [cEins, cHundert]; if TMyEnum(i) in s then //... end; |
Re: inkompatible Typen bei Mengen (Set)
Genau !
Set of geht nur mit max. 256 Werten. Ein Integer geht aber bis ?????????? Deshalb ist IN nicht geeignet ! Wer mit 10 testet, der denkt es gehe, aber mit 300 kommt der Rest. :mrgreen: |
Re: inkompatible Typen bei Mengen (Set)
Zitat:
Ich hatte ein ähnliches Problem und habe es so gelöst.
Delphi-Quellcode:
Das sollte sich auch leicht auf integer Typen umstricken lassen.
function IfFloatIn(w : extended; a : array of extended; Tol: extended): boolean;
var i : integer; begin result := true; for i := 0 to high(a) do if SameValue(w, a[i], Tol) then exit; result := false; end; procedure TForm1.BitBtn1Click(Sender: TObject); var Radius : extended; begin Radius := StrToFloat(Edit1.Text); if IfFloatIn(Radius,[10.5, 11.7, 17.8],0) then Label1.Caption := 'true' else Label1.Caption := 'false'; end; Siehe auch ![]() |
Re: inkompatible Typen bei Mengen (Set)
Zitat:
also wenn der eindruck entstanden ist, dass ich dachte, ein integer würde direkt mit einem Enum-typ korrespondieren, habe ich das hier hoffentlich berichtigt - ich habe nur gesagt, dass es _möglich_ ist, durch typecasts auch integer in Enums zu verwandeln. (so stell ich mir das zumindest vor, aber wenn mich nicht alles täuscht sollte ich da richtig liegen). |
Re: inkompatible Typen bei Mengen (Set)
Zitat:
Aber Du hast gar keinen Typ dafür definiert - also kannst Du auch keinen Cast anwenden. Lösung: Definiere den Aufzählungstyp:
Delphi-Quellcode:
type
TFoo = (f0, f1, f2); TFooSet = set of TFoo; function Test(FooSet: TFooSet; FooBar: Integer): Boolean; begin Result := TFoo(FooBar) in FooSet; end; procedure TForm1.Button1Click(Sender: TObject); var FooSet: TFooSet; FooBar: Integer; begin FooSet := [f0, f2]; FooBar := Integer(f2); ShowMessage(BoolToStr(Test(FooSet, FooBar), True)); end; |
Re: inkompatible Typen bei Mengen (Set)
Hallo alle
Danke erst einmal für die zahlreichen Antworten. Also mein Integer kann nur Werte von -1..10 annehmen (ich weiss ich hätte dafür nicht unbedingt einen Integer verwenden müssen). Mit der Lösung von NicoDE und Khabarakh hab ich's probiert und das würde gehen. Jedoch bin ich jetzt auch nicht mehr sicher ob ich das wirklich so machen soll... Also mein Fehler war:
Delphi-Quellcode:
statt
tMyMenge = set of(cEins,cHundert,cTausend);
Delphi-Quellcode:
Ob ich nun CASE verwende oder doch engine's Lösung weiss ich noch nicht...
tMyEnum = (cEins,cHundert,cTausend);
tMySet = set of tMyEnum; Danke und Gruss Tom |
Re: inkompatible Typen bei Mengen (Set)
Moin!
@TomDooley: Mich würde vor allem die mögliche -1 stören bzw. davon abhalten einen TypeCast zu machen. @Other: Ich hoffe ihr könnt mir mal erklären, wie sich das folgende begründet: 1. Es sind sich alle einig, das ein Set aus maximal 255 Elementen bestehen kann (ich auch, auch die Hilfe) 2. Es ist für einige selbstverständlich, das es ein Byte gross ist. 3. Es ist wiederrum für andere selbstverständlich, das ein Set mit Bitkombinationen arbeitet. Nun zu meiner Frage: Ein Byte hat 8 Bits und kann somit 8 Elemente beinhalten, die eine Kombinationsvielfalt von 2^8 = 256 bietet. Aber bei 256 möglichen Elemente laut Hilfe, habe ich eine Kombinationsmöglichkeit der Menge von 2^256 und das passt in kein Byte. Mit anderen Worten: Entweder ist ein Set nicht 1 Byte gross sondern 256/8 Byte gross --- oder er arbeitet nur bis zu einer bestimmten Mengenanzahl mit Bitoperationen --- oder Delphi kann Daten sehr gut kombinieren/komprimieren. (1 Byte würde reichen, wenn es keine Menge wäre sondern exklusiv, dann würde es hinhauen --- ein Byte kann halt 256 unterschiedliche Werte exklusiv halten (1 Wert maximal zu einem definiertem Zeitpunkt) - aber keine Kombination von 256 unterschiedlichen Werten. MfG Muetze1 |
Re: inkompatible Typen bei Mengen (Set)
Zitat:
ps: nicht umsonst wurden im Thread Enums und Sets wild vermischt/verwechselt... |
Re: inkompatible Typen bei Mengen (Set)
Ein Set kann eventuell 256 Werte aufnehmen. Ehrlich gesagt : nie probiert. Es geht aber auch eher um die Typen an sich, statt um die Anzahl der Elemente. Es gibt keinen SET OF INTEGER ! Wohl aber kann man sich ein SET OF BYTE bauen. Bei den Elementen eines Sets muß es sich lediglich um einen Aufzählungstyp handeln, der nicht mehr als 256 verschiedene Werte haben kann !
Hierbei genügt es allerdings nicht, wie bereits gesagt, nur einen Typ zu deklarieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 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-2025 by Thomas Breitkreuz