Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 11:53 Uhr.
Seite 2 von 2     12   

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