AGB  ·  Datenschutz  ·  Impressum  







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

Anzahl der Elemente in einem Mengentyp

Ein Thema von Stevie · begonnen am 15. Jun 2004 · letzter Beitrag vom 17. Jun 2004
Antwort Antwort
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Anzahl der Elemente in einem Mengentyp

  Alt 15. Jun 2004, 15:32
Hi,

wie ermittel ich die Anzahl der Elemente, die in einer Mengentyp-Variable vorhanden sind?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#2

Re: Anzahl der Elemente in einem Mengentyp

  Alt 15. Jun 2004, 15:55
Delphi-Quellcode:
TYPE
  TWert = (wWert1, wWert2, wWert3);
  TWerte = SET OF TWert;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  // HIGH gibt den größten Wert im Bereich des Arguments zurück.
  // ORD gibt den Ordinalwert eines Ausdrucks des Typs Ordinal zurück.
  // beginnt mit 0, darum +1 für anzahl
  ShowMessage(IntToStr(Ord(high(TWert))+1));
end;
edit: Oh sorry ich seh grad, dass Du bissl was anderes gefragt hast

Gruß
Stephan
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#3

Re: Anzahl der Elemente in einem Mengentyp

  Alt 15. Jun 2004, 16:08
Delphi-Quellcode:
FUNCTION GetSetCount(CONST aValue : TWerte) : Word;
// Gibt die Anzahl der enthaltenen TWert-Werte in aValue zurück
// Maximalwert: 256 --> Word als Rückgabe-Typ
VAR
  iAnzahl,
  iIndex : Word;
begin
  iAnzahl := 0;
  FOR iIndex:=Ord(Low(TWert)) TO Ord(High(TWert)) DO
  BEGIN
    IF TWert(iIndex) IN aValue THEN Inc(iAnzahl);
  END;
  result := iAnzahl;
end;


{ *** Beispiel für Aufruf: *** }
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(GetSetCount([wWert2,wWert3])));
end;
Funzt halt immer nur für den bestimmten Typ
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

Re: Anzahl der Elemente in einem Mengentyp

  Alt 17. Jun 2004, 08:53
Jo, soweit bin ich auch gekommen, aber ich wollte halt eine allgemeingültige Lösung. Geht sowas überhaupt?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#5

Re: Anzahl der Elemente in einem Mengentyp

  Alt 17. Jun 2004, 09:07
Mit einer richtigen Programmiersprache geht das (z.B. mit Templates in C++ oder mit Haskell). In Delphi gibt es glaubig (noch) keinen Weg.
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#6

Re: Anzahl der Elemente in einem Mengentyp

  Alt 17. Jun 2004, 09:30
Möglicherweise lässt sich sowas mit ifdefs nachbauen.
Siehe -> http://www.dummzeuch.de/delphi/objec...s/deutsch.html

grüße, daniel
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Anzahl der Elemente in einem Mengentyp

  Alt 17. Jun 2004, 10:20
Zitat von Stevie:
Jo, soweit bin ich auch gekommen, aber ich wollte halt eine allgemeingültige Lösung. Geht sowas überhaupt?
Ja !!!
Und zwar gibt es da eine sehr interessante Lösung dafür (nur leider find ich den Artikel nicht mehr im Internet).
Eine Menge (=Set) ist im Speicher nur eine Anzahl von Bytes (max 32 Bytes = Menge mit 256 Elementen). Zum Zählen der gesetzten Bits in der Menge braucht es einen Zeiger auf die Mengenvariable und die Grösse der Menge (mit sizeof(TMengentyp)).

Anstatt die gesetzten Bits einzeln zu zählen, wird das Abbild der Menge in Nibbles (4 Bit) zerteilt und dann baut man sich eine Lookuptabelle, in der die Anzahl Bits für alle 16 Möglichkeiten eines Nibbles ausgerechnet sind:
Code:
Bits  Anzahl
=============
0000 = 0
0001 = 1
0010 = 1
0011 = 2
0100 = 1
0101 = 2
0110 = 2
0111 = 3
1000 = 1
1001 = 2
1010 = 2
1011 = 3
1100 = 2
1101 = 3
1110 = 3
1111 = 4
Delphi-Quellcode:
function CountBitsInNibble(x:Byte):Integer;
const
   lu : packed array[0..15] of Byte = (0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);
begin
   Result := lu[x];
end;
Die Anzahl der gesetzten Bits in einem Speicherbereich ist dann auch ganz einfach:
Delphi-Quellcode:
function CountBitsInMem(x:Pointer; size:Integer):Integer;
var
   i : Integer;
   b : Byte;
begin
   Result := 0;
   for i := 0 to size-1 do
   begin
      b := PByte(x)^; // hole ein Byte
      Inc(PByte(x)); // erhöhe der Zeiger auf den Speicher
      // unteres Nibble
      Inc(Result, CountBitsInNibble(b and $0F));
      // oberes Nibble
      Inc(Result, CountBitsInNibble(b shr 4));
   end;
end;
Man könnte auch eine Tabelle für ein ganzes Byte aufbauen, man bräuchte dann aber 256 Bytes im RAM
statt 16 Bytes für ein Nibble.

Will man die Anzahl der nicht gesetzten Bits zählen ist dies auch ganz einfach:
Delphi-Quellcode:
function CountNullBitsInMem(x:Pointer; size:Integer):Integer;
begin
   // pro Byte sind es 8 Bit
   // Anzahl der Bits, die auf 0 sind ist die Gesamtanzahl aller Bits minus
   // der Anzahl der gesezten Bits
   Result := (size * 8)-CountBitsInMem(x, size);
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

Re: Anzahl der Elemente in einem Mengentyp

  Alt 17. Jun 2004, 10:45
PERFEKT!!!

Das mit den Bits hatte ich mir auch schon überlegt, aber die Umsetzung war mir nicht klar.

Danke!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#9

Re: Anzahl der Elemente in einem Mengentyp

  Alt 17. Jun 2004, 11:31
Genial einfach, einfach genial
Muss ich mir merken

Stephan
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:16 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