यदि आप एक गैर-var पैरामीटर के रूप में गतिशील सरणी पास करते हैं, तो संकलक एक प्रतिलिपि बना देगा।
नीचे दिया गया छोटा कोड नमूना दर्शाता है कि फॉर्म कैप्शन में 37/42 प्रदर्शित करके।
procedure IncArray1(data: array of integer);
var i : integer;
begin
for i := Low(data) to High(data) do
data[i] := data[i] + 5;
end;
procedure IncArray2(var data: array of integer);
var i : integer;
begin
for i := Low(data) to High(data) do
data[i] := data[i] + 5;
end;
procedure TForm8.FormCreate(Sender: TObject);
var
data: array of integer;
begin
SetLength(data, 1);
data[0] := 37;
IncArray1(data);
Caption := IntToStr(data[0]);
IncArray2(data);
Caption := Caption + '/' + IntToStr(data[0]);
end;
अगर हम उत्पन्न कोडांतरक कोड पर गौर, IncArray1
004552B4 8BCA mov ecx,edx
004552B6 85C9 test ecx,ecx
004552B8 7807 js $004552c1
004552BA 8B1C88 mov ebx,[eax+ecx*4]
004552BD 49 dec ecx
004552BE 53 push ebx
004552BF 79F9 jns $004552ba
004552C1 8BC4 mov eax,esp
साथ इस कोड को प्रतियां स्रोत सरणी ढेर करने के लिए शुरू होता है और (= पते में संग्रहीत पहला तत्व का पता करने के लिए eax सेट अंतिम धक्का के बाद स्टैक सूचक)। ढेर नीचे बढ़ता है इसलिए कोड अंतिम तत्व के साथ शुरू होता है (edx में उच्च (डेटा) होता है जब IncArray1 कहा जाता है) और दोहराया जाता है (तत्व पढ़ें; पुश तत्व; कमी सूचकांक) जब तक यह तत्व 0 तक नहीं पहुंच जाता है।
IncArray2 में कोई नहीं है ऐसा कोड IncArray2 और IncArray2 को कॉल करने से पहले कॉलर डेटा के पते को ईएक्स रजिस्टर में संग्रहीत करता है, बस इस पते का उपयोग करता है।
यदि आप किसी भी कारण से 'var' का उपयोग नहीं करना चाहते हैं, तो आप डेटा के पते को अपनी विधि में पास कर सकते हैं। लेकिन जैसा कि आप पैरामीटर घोषणा में वाक्यविन्यास 'डेटा:^पूर्णांक का सरणी' का उपयोग नहीं कर सकते हैं, आपको अपने डेटा के लिए एक प्रकार घोषित करना होगा। और आपको विधि में हर जगह 'डेटा' के बजाय 'डेटा ^' का उपयोग करना होगा।
type
TData = array of integer;
PData = ^TData;
procedure IncArray(data: PData);
var i : integer;
begin
for i := Low(data^) to High(data^) do
data^[i] := data^[i] + 5;
end;
procedure TForm8.FormCreate(Sender: TObject);
var
data: TData;
begin
SetLength(data, 2);
data[0] := 37;
IncArray(@data);
Caption := IntToStr(data[0]);
end;
डेल्फी 2007
ठीक है तो ऐसा करने का कोई तरीका है, मेरे पास एक बड़ी सरणी है जिसे मैं संदर्भ के माध्यम से काम करना चाहता हूं। सरणी की प्रतिलिपि महंगी comptationaly दूर है। – Arthur
हां, बस उपरोक्त कोड में IncArray2 करता है - उपयोगकर्ता 'var' उपसर्ग। – gabr
@gabr, क्या आप जांच सकते हैं कि जब आप म्यूटेट नहीं करते हैं तो गतिशील सरणी की प्रतिलिपि बनाई जाती है या नहीं?मुझे पता है कि तार कॉपी-ऑन-राइट हैं। –