AFAIK gibt es keine eingebaute Funktion dafür. Suche im Internet fand ich diese function und es funktioniert für mich, aber ich bevorzuge es nicht zu verwenden, da es Montage ist und ich kann nicht verstehen, was es tut. Also schrieb ich diese Funktion, die auch funktioniert:Wie kann ich die Anzahl der Elemente einer beliebigen Variablen vom Typ festlegen?
function Cardinality(const PSet: PByteArray;
const SizeOfSet(*in bytes*): Integer): Integer;
const
Masks: array[0..7] of Byte = (1, 2, 4, 8, 16, 32, 64, 128);
var
I, J: Integer;
begin
Result := 0;
for I := 0 to SizeOfSet - 1 do
for J := 0 to 7 do
if (PSet^[I] and Masks[J]) > 0 then
Inc(Result);
end;
Jetzt will ich wissen, ob ich auf diese Funktion verlassen können? Oder vielleicht gibt es einen Trick hinter dem eingestellten Datentyp und deshalb hat Delphi keine eingebaute Methode dafür.
Aber if
meine Funktion ist zuverlässig then
wie kann ich verbessern, es zu:
- Pass Konstanten es
- eine Typprüfung durchführen und sicherstellen, dass ein Satz an die Funktion geben wird
- Pass der Wert statt dessen Adresse
- Get von
SizeOfSet
Parameter los
Ich möchte es wie Cardinality(AnySet)
anstelle von Cardinality(@AnySet, SizeOf(TAnySet))
nennen.
Übrigens, ich muss dies in XE und XE5 kompilieren.
Danke, aber XE nicht kompilieren: ** E2506 Die im Interface-Abschnitt deklarierte Methode des parametrisierten Typs darf kein lokales Symbol 'GetCardinality' ** verwenden. Also muss ich 'GetCardinality' als Klassenfunktion definieren. Dasselbe Problem mit 'Masken'. Nach diesen Änderungen läuft es und funktioniert gut. – saastn
Ja, das ist ein Compilerfehler in älteren Compilern. Sie können diese Funktion manuell inline einfügen, wenn Sie möchten. Wie auch immer, das Konzept ist solide. –