gpt4 book ai didi

delphi - Delphi 中如何通过引用传递数组?

转载 作者:行者123 更新时间:2023-12-03 14:38:07 25 4
gpt4 key购买 nike

我已经阅读了有关通过引用传递的内容

procedure test(var x:integer);
begin
x:=x+5;
end;

所以上面的代码通过引用更新了5。我假设如果我通过引用更新数组,我可以声明 var X: array of blah... 有一些绑定(bind)错误,只是想知道我是否应该使用指针的数据类型数据或者指针是否始终为 int...只是为了让我知道这是否是我通过引用传递的方式或代码中的其他内容才是问题所在。

最佳答案

如果将动态数组作为非 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 设置为第一个元素的地址(= 最后一次压入后存储在堆栈指针中的地址)。堆栈向下增长,因此代码从最后一个元素开始(调用 IncArray1 时 edx 包含 High(data))并重复(读取元素;推送元素;递减索引)直到到达元素 0。

IncArray2 不包含此类代码。调用者在调用 IncArray2 之前将数据的地址存储到 eax 寄存器中,IncArray2 只是使用该地址。

如果您出于任何原因不想使用“var”,您可以将数据的地址传递给您的方法。但由于您不能在参数声明中使用语法“data: ^array of integer”,因此您必须声明数据的类型。并且您必须在方法中的所有地方使用“data^”而不是“data”。

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 进行测试。

关于delphi - Delphi 中如何通过引用传递数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/714456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com