AFAIKそのための組み込み関数はありません。ウェブ検索私はこれを見つけたfunctionそれは私のために働くが、私はそれがアセンブリであり、私はそれが何をしているのか理解できないので、それを使用しないことを好む。だから私も働き、この機能を書いた:タイプセットの変数の要素数を取得するにはどうすればよいですか?
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;
さて、私はこの機能に頼ることができるかどうかを知りたいですか?または、設定されたデータ型の背後にトリックがあることがあります。そのため、デルファイにはそのための組み込みメソッドがありません。
しかしif
私の関数は信頼性があるがthen
がどのように私はそれを改善することができます。それに
- パス定数
- は型チェックを行い、設定が機能
- 峠に渡されていることを確認します代わりに、そのアドレス
- の値は
SizeOfSet
パラメータを取り除く
Cardinality(@AnySet, SizeOf(TAnySet))
の代わりにCardinality(AnySet)
のように呼びたいと思っています。
ところで、私はXEとXE5の両方でこれをコンパイルする必要があります。
おかげで、しかしXEは、それをコンパイルしません:** E2506インタフェースセクションで宣言されたパラメータ化された型のメソッドは、ローカルシンボル 'GetCardinality' **を使用してはなりません。だから私は 'GetCardinality'をクラス関数として定義しなければなりません。 「マスク」についても同じ問題があります。それらの変更の後、実行され、正常に動作します。 – saastn
これは古いコンパイラのコンパイラの欠陥です。必要に応じて、この機能を手動でインライン化することができます。とにかく、コンセプトは健全です。 –