Dinamik diziyi bir var olmayan parametre olarak iletirseniz, derleyici bir kopya oluşturacaktır. Aşağıdaki küçük kod örneği, form başlığında 37/42 görüntülendiğini göstermektedir. Biz oluşturulan Çevirici koduna bakarsak
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 yığınına
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
ile bu kod kopyalar kaynak dizisi başlar ve (= Adres saklanan birinci elemanın adresine eax ayarlar son basamağından sonra yığın işaretçisi. Yığın, son öğe ile başlar (kod, IncArray1 çağrıldığında edx Yüksek (veri) içerir) ve eleman 0'a gelinceye kadar (okuma öğesi; itme öğesi; eksiltme indeksi) tekrarlanır.
IncArray2, böyle bir kod. Arayan kişi, IncArray2 ve IncArray2'yi çağırmadan önce verilerin adresini eax kaydına kaydeder.
Herhangi bir nedenle 'var' kullanmak istemiyorsanız, verilerinizin adresini yönteminize iletebilirsiniz. Ancak, parametre beyanında sözdizimi 'verisini: tamsayı dizisini' kullanamadığınızdan, verileriniz için bir tür bildirmeniz gerekir. Ve yöntemde her yerde 'veri' yerine 'data ^' kullanmanız gerekir.
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;
Delphi 2007.
Tamam, bunu yapmanın bir yolu var, referans yoluyla üzerinde çalışmak istediğim geniş bir dizim var. diziyi kopyalamak comptationaly pahalı olmaktan çok uzaktır. – Arthur
Evet, tıpkı IncArray2'nin yukarıdaki kodda yaptığı gibi - kullanıcı 'var' öneki. – gabr
@gabr, Değişmeyen bir dinamik dizinin kopyalanıp kopyalanmadığını kontrol edebilir misiniz?O dizelerin yazıya kopyalandığını biliyorum. –