![]() |
Anzahl der Elemente in einem Mengentyp
Hi,
wie ermittel ich die Anzahl der Elemente, die in einer Mengentyp-Variable vorhanden sind? |
Re: Anzahl der Elemente in einem Mengentyp
Delphi-Quellcode:
edit: Oh sorry ich seh grad, dass Du bissl was anderes gefragt hast :stupid:
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; Gruß Stephan |
Re: Anzahl der Elemente in einem Mengentyp
Delphi-Quellcode:
Funzt halt immer nur für den bestimmten Typ :|
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; |
Re: Anzahl der Elemente in einem Mengentyp
:| Jo, soweit bin ich auch gekommen, aber ich wollte halt eine allgemeingültige Lösung. Geht sowas überhaupt?
|
Re: Anzahl der Elemente in einem Mengentyp
Mit einer richtigen Programmiersprache :mrgreen: geht das (z.B. mit Templates in C++ oder mit Haskell). In Delphi gibt es glaubig (noch) keinen Weg.
|
Re: Anzahl der Elemente in einem Mengentyp
Möglicherweise lässt sich sowas mit ifdefs nachbauen.
Siehe -> ![]() grüße, daniel |
Re: Anzahl der Elemente in einem Mengentyp
Zitat:
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:
Die Anzahl der gesetzten Bits in einem Speicherbereich ist dann auch ganz einfach:
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;
Delphi-Quellcode:
Man könnte auch eine Tabelle für ein ganzes Byte aufbauen, man bräuchte dann aber 256 Bytes im RAM
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; 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; |
Re: Anzahl der Elemente in einem Mengentyp
PERFEKT!!! :dancer2: :dancer2: :dancer2:
Das mit den Bits hatte ich mir auch schon überlegt, aber die Umsetzung war mir nicht klar. Danke! :cheers: |
Re: Anzahl der Elemente in einem Mengentyp
Genial einfach, einfach genial :thuimb:
Muss ich mir merken Stephan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 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