Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Mengen (https://www.delphipraxis.net/41384-problem-mit-mengen.html)

Neutral General 2. Mär 2005 16:42


Problem mit Mengen
 
Also irgendwie steh ich aufm Schlauch :

Delphi-Quellcode:
type
 TGegeben = set of (Radius,Hoehe,Umfang,Grundflaeche,Volumen,Oberflaeche);

var
 Geg : TGegeben;

procedure KeineAhnung;
begin
Geg := Geg + [Hoehe]; // "Ordinaltyp erforderlich !"
end;
Da kommt bei der Zeile die Meldung das ein Ordinaltyp erforderlich sei :roll:
Wie geht das denn sonst ? Das hat ma so funktioniert :mrgreen:

maximov 2. Mär 2005 16:45

Re: Problem mit Mengen
 
Das ist richtig. und bei mir kompiliert das auch prima.

Aber an der spelle würd ich auch include verwenden.

PS: du hast Hoehe bestimmt wo anders deklariert! Da wette ich.

Neutral General 2. Mär 2005 16:48

Re: Problem mit Mengen
 
Stimmt in einer Klasse -.-
Was hat das Hoehe aus der Klasse mit dem set zu tun :roll:

Treffnix 2. Mär 2005 16:56

Re: Problem mit Mengen
 
Schau einfach mal, was die Codevervollständig von Hoehe hält oder such nach der Deklaration und lass dich überraschen. Ansonsten benenn halt Hoehe im Set mal in was anderes um.

Hansa 2. Mär 2005 17:02

Re: Problem mit Mengen
 
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
type
 TGegeben = set of (Radius,Hoehe,Umfang,Grundflaeche,Volumen,Oberflaeche);

var
 Geg : TGegeben;

procedure KeineAhnung;
begin
Geg := Geg + [Hoehe]; // "Ordinaltyp erforderlich !"
end;

Häufiger Denkfehler. Und zwar gleich zweimal. 8) Wo wird Geg überhaupt initialisiert ? Und selbst wenn es anderswo initialisiert wurde : da kann man nur sagen, "sage mir eine Zahl und ich rechne aus, was das 5-fache davon ist". Ohne daß Du die Zahl nennst. 8)

maximov 2. Mär 2005 17:12

Re: Problem mit Mengen
 
Zitat:

Zitat von Hansa
...Häufiger Denkfehler. Und zwar gleich zweimal. 8) Wo wird Geg überhaupt initialisiert ? Und selbst wenn es anderswo initialisiert wurde : da kann man nur sagen, "sage mir eine Zahl und ich rechne aus, was das 5-fache davon ist". Ohne daß Du die Zahl nennst. 8)

Das macht sinn :drunken: ...aber nicht in diesem zusammenhang.

himitsu 2. Mär 2005 17:13

Re: Problem mit Mengen
 
Zitat:

Zitat von Neutral General
Stimmt in einer Klasse -.-
Was hat das Hoehe aus der Klasse mit dem set zu tun :roll:

Tja, woher soll der Compiler denn wissen, welches "Hoehe" du dort verwenden willst, meistens nimmt der ja die letzte deklaration.

:warn: Also immer aufpassen, wo du welchen namen verwendest.

PS: du kannst ja mal die einzelnen Werde des Sets umbenennen, oftmals wird in soeinem Fall ein Teil des Set-Namens verwendet.
So kann man dann auch mal ähnliche Typen Deklarieren, ohne gleich wieder in einen Namenskonflikt zu geraden. :zwinker:

Delphi-Quellcode:
Type TGegeben = Set of (GegRadius, GegHoehe, GegUmfang,
    GegGrundflaeche, GegVolumen, GegOberflaeche);

  TSoll = Set of (SoRadius, SoHoehe, SoUmfang,
    SoGrundflaeche, SoVolumen, SoOberflaeche);

Neutral General 2. Mär 2005 17:21

Re: Problem mit Mengen
 
Ja es funktioniert jetzt :)
Hab meine Setelemente umbenannt...

Hansa 2. Mär 2005 17:24

Re: Problem mit Mengen
 
Zitat:

Zitat von maximov
...Das macht sinn ...aber nicht in diesem zusammenhang.

Ich merke, das Ganze ist schon fast zu hoch. 8) Hier fehlen absolute Grundlagen. Ein Ordinaltyp und ein Aufzählungstyp sind 2 Paar Schuhe. Aber keiner merkts und sieht nicht mal die beiden anderen Fehler. :mrgreen:

himitsu 2. Mär 2005 17:33

Re: Problem mit Mengen
 
Zitat:

Zitat von Hansa
Ich merke, das Ganze ist schon fast zu hoch. 8) Hier fehlen absolute Grundlagen. Ein Ordinaltyp und ein Aufzählungstyp sind 2 Paar Schuhe. Aber keiner merkts und sieht nicht mal die beiden anderen Fehler. :mrgreen:

Also die einzelnen Werte eines Set-Typs sin ja schließlich ordinale Typen, also stimmt das schon ;)

negaH 2. Mär 2005 17:50

Re: Problem mit Mengen
 
Man definiert es meistens so:

Delphi-Quellcode:
type
  TGegebenesElement = (geRadius, geHoehe, geUmfang, geGrundflaeche, geVolumen, geOberflaeche);
  TGegebeneElemente = set of TGegebenesElement;
TGegebenesElement ist eine Enumeration/Aufzählungstyp und TGegebeneElemente die eigentliche Menge zum zur Enumeration. Dann funktionieren auch Include(), Exclude() und alle anderen Mengenoperationen.

Gruß Hagen

Neutral General 2. Mär 2005 18:28

Re: Problem mit Mengen
 
Noch ne Frage nebenbei : Wie bekommt man heraus wie viele Elemente in einer Menge gerade enthalten sind ?

Hansa 2. Mär 2005 18:33

Re: Problem mit Mengen
 
Gar nicht. Wüßte nicht wie. Und es wäre nett, wenn du mal zeigst, wie Du aus einem Typen eine Variable machst.

Neutral General 2. Mär 2005 18:43

Re: Problem mit Mengen
 
ka :mrgreen:
Naja ich glaube ich weis wie ich sie doch zählen kann...

negaH 2. Mär 2005 20:35

Re: Problem mit Mengen
 
Delphi-Quellcode:
function CountOfElements(const Elements: TElements): Integer;
var
  I: TElement;
begin
  Result := 0;
  for I := Low(I) to High(I) do
    if I in Elements then
      Inc(Result);
end;

function CountOfElements(const Elements: TElements): Integer;
var
  I: Int64;
begin
  I := Ord(Elements);
  Result := 0;
  while I <> 0 do
  begin
    if Odd(I) then Inc(Result);
    I := I shr 1;
  end;
end;
ungetestet, müsste aber so gehen.

Gruß Hagen

himitsu 3. Mär 2005 12:56

Re: Problem mit Mengen
 
Also, wenn den einzelnen Elementen keine bestimmten Werte aufgezwungen sind, dann reicht auch schon volgendes

Delphi-Quellcode:
Elemente := Ord(High(TheSet)) - Ord(Low(TheSet)) + 1;
oder ganz kurz, da Ord(Low(TheSet)) = 0 sein sollte

Delphi-Quellcode:
Elemente := Ord(High(TheSet)) + 1;
(es könnte sogar sein, dass die Ord's auch entfallen können)

negaH 4. Mär 2005 02:27

Re: Problem mit Mengen
 
Delphi-Quellcode:

  SizeOf(Set) == High(Set) +1 <> CountOfElementsInSet(Set).
In anderen Worten High(Set) +1 gibt die Größe der Menge, d.h. wieviele unterschiedliche Elemente sie maximal enthalten kann. Dies ist somit nicht die Anzahl der tatsächlich enthaltenen Elemnte zu einem bestimmten zeitpunk.

Die max. Anzahl der Elemente in der Menge TZiffern = [0...9] ist 10 == High(TZiffern) +1,
eine Mengevariabale vom Typ TZiffern könnte aber auch so aussen -> Ziffern = [1,5,8]. High(Ziffern) == High(TZiffern) = 10, die Anzahl der real enthaltenen Elemente ist aber nur 3, denn nur drei Zahlen sind aktuell in Ziffern.

himitsu, damit gibt dein Vorschlag nicht wie gefragt

Zitat:

Wie bekommt man heraus wie viele Elemente in einer Menge gerade enthalten sind ?
die Anzahl der aktuell enthaltenen Elemente zurück.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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