加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:25:36 所属栏目:大数据 来源:网络整理
导读:我已经阅读了关于参考的传递 procedure test(var x:integer);begin x:=x+5;end; 所以以上代码通过引用更新5.我假设如果我通过引用更新数组我可以声明var X:数组blah …有一些绑定的错误,只是想知道我是否应该使用数据类型的指针数据或指针总是int …所以我
我已经阅读了关于参考的传递
procedure test(var x:integer);
begin
  x:=x+5;
end;

所以以上代码通过引用更新5.我假设如果我通过引用更新数组我可以声明var X:数组blah …有一些绑定的错误,只是想知道我是否应该使用数据类型的指针数据或指针总是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包含高(数据)),并重复(读取元素;推送元素;递减索引),直到它到达元素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测试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读