Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi inkompatible Typen bei Mengen (Set) (https://www.delphipraxis.net/49449-inkompatible-typen-bei-mengen-set.html)

TomDooley 11. Jul 2005 16:12


inkompatible Typen bei Mengen (Set)
 
Hallo

Ich habe folgende Menge definiert:
Delphi-Quellcode:
tMyMenge = set of(cEins,cHundert,cTausend);
Nun möchte ich prüfen ob ein Integer einen Wert der Menge angenommen hat:
Delphi-Quellcode:
if (MyInteger in MyMenge) then...
Leider funktioniert das nicht. Der Compiler gibt folgende Fehlermeldung aus:
Delphi-Quellcode:
Inkompatible Typen: 'Integer' und 'Enumeration'
Ich denke, irgendwie muss ich MyInteger in Enumeration casten... Geht das überhaupt? Wie?

Danke und Gruss

Tom

Christian Seehase 11. Jul 2005 16:15

Re: inkompatible Typen bei Mengen (Set)
 
Moin Tom,

das ginge so

Delphi-Quellcode:
TMyMenge(MyInteger)

Grendel 11. Jul 2005 16:17

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 ...

TomDooley 11. Jul 2005 16:57

Re: inkompatible Typen bei Mengen (Set)
 
Zitat:

Zitat von Christian Seehase
das ginge so
Delphi-Quellcode:
TMyMenge(MyInteger)

Das habe ich auch probiert, bzw.
Delphi-Quellcode:
if (tMyMenge(MyInteger) in MyMenge) then ...
aber das tut so nicht. Ich bekomme dann die Fehlermeldung:

Delphi-Quellcode:
Ungültige Typumwandlung
@Grendel:
Zitat:

Oder, um sicherzustellen, daß Du nicht außerhalb des Bereiches liegst kannst Du auch mit
GetEnumName() bzw. GetEnumValue() arbeiten.
:gruebel: Wie meinst du das? Soll ich auf alle drei Werte im Set prüfen?

Danke und Gruss

Tom

Khabarakh 11. Jul 2005 17:04

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

Hansa 11. Jul 2005 19:43

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:
in
bei 3 möglichen Varianten ? :shock:

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.

BlackJack 11. Jul 2005 21:00

Re: inkompatible Typen bei Mengen (Set)
 
@Hansa: wieso spekulation? wieso kein in? der code von kabarakaback funktioniert doch einwandfrei.

SirThornberry 11. Jul 2005 21:05

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?

BlackJack 11. Jul 2005 21:11

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:
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;
ü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).

Hansa 11. Jul 2005 21:13

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:

engine 11. Jul 2005 21:32

Re: inkompatible Typen bei Mengen (Set)
 
Zitat:

Zitat von TomDooley
Nun möchte ich prüfen ob ein Integer einen Wert der Menge angenommen hat:
Delphi-Quellcode:
if (MyInteger in MyMenge) then...
Leider funktioniert das nicht.

Hallo Tom,

Ich hatte ein ähnliches Problem und habe es so gelöst.
Delphi-Quellcode:
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;
Das sollte sich auch leicht auf integer Typen umstricken lassen.
Siehe auch DP

BlackJack 11. Jul 2005 23:11

Re: inkompatible Typen bei Mengen (Set)
 
Zitat:

Zitat von Hansa
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:

wenn man aber einen integer mit einem Enum-typ (auch 256 möglichkeiten) typecastet, wird von dem Integer nur das 1. Byte angesprochen, d.h. auch hier kommt man wieder auf 256 möglichkeiten. natürlich muss dieses byte dann aber mit einem wert gefüllt sein, der nicht höher als der Ordinal-wert des letzen "items" eines Enum-typen ist.

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).

NicoDE 12. Jul 2005 00:03

Re: inkompatible Typen bei Mengen (Set)
 
Zitat:

Zitat von TomDooley
Nun möchte ich prüfen ob ein Integer einen Wert der Menge angenommen hat:
Delphi-Quellcode:
if (MyInteger in MyMenge) then...

Du möchtest einen Integer auf ein Element der Menge casten (Aufzählungsemelent).
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;

TomDooley 12. Jul 2005 08:05

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:
tMyMenge = set of(cEins,cHundert,cTausend);
statt
Delphi-Quellcode:
tMyEnum = (cEins,cHundert,cTausend);
tMySet = set of tMyEnum;
Ob ich nun CASE verwende oder doch engine's Lösung weiss ich noch nicht...

Danke und Gruss

Tom

Muetze1 12. Jul 2005 09:32

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

NicoDE 12. Jul 2005 09:40

Re: inkompatible Typen bei Mengen (Set)
 
Zitat:

Zitat von Muetze1
2. Es ist für einige selbstverständlich, das es ein Byte gross ist.

Wie Du bereits festgestellt hast, ist die Annahme falsch.

ps: nicht umsonst wurden im Thread Enums und Sets wild vermischt/verwechselt...

Hansa 12. Jul 2005 10:44

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