AGB  ·  Datenschutz  ·  Impressum  







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

inkompatible Typen bei Mengen (Set)

Ein Thema von TomDooley · begonnen am 11. Jul 2005 · letzter Beitrag vom 12. Jul 2005
Antwort Antwort
Seite 2 von 2     12   
engine

Registriert seit: 6. Mär 2005
73 Beiträge
 
#11

Re: inkompatible Typen bei Mengen (Set)

  Alt 11. Jul 2005, 21:32
Zitat von TomDooley:
Nun möchte ich prüfen ob ein Integer einen Wert der Menge angenommen hat:
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
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#12

Re: inkompatible Typen bei Mengen (Set)

  Alt 11. Jul 2005, 23:11
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.
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).
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#13

Re: inkompatible Typen bei Mengen (Set)

  Alt 12. Jul 2005, 00:03
Zitat von TomDooley:
Nun möchte ich prüfen ob ein Integer einen Wert der Menge angenommen hat:
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;
  Mit Zitat antworten Zitat
TomDooley

Registriert seit: 26. Jan 2004
124 Beiträge
 
#14

Re: inkompatible Typen bei Mengen (Set)

  Alt 12. Jul 2005, 08:05
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:
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#15

Re: inkompatible Typen bei Mengen (Set)

  Alt 12. Jul 2005, 09:32
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#16

Re: inkompatible Typen bei Mengen (Set)

  Alt 12. Jul 2005, 09:40
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...
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#17

Re: inkompatible Typen bei Mengen (Set)

  Alt 12. Jul 2005, 10:44
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 03:45 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