![]() |
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 11:53 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