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
हाँ, यह पुराने कंपाइलर्स में एक कंपाइलर दोष है। यदि आप चाहें तो मैन्युअल रूप से उस फ़ंक्शन को इनलाइन कर सकते हैं। वैसे भी, अवधारणा ध्वनि है। –