我已经阅读了关于参考的传递
procedure test(var x:integer); begin x:=x+5; end;
所以以上代码通过引用更新5.我假设如果我通过引用更新数组我可以声明var X:数组blah …有一些绑定的错误,只是想知道我是否应该使用数据类型的指针数据或指针总是int …所以我知道这是我是如何做我的传递通过引用或其他在我的代码中的问题.
解决方法
如果将动态数组作为非var参数传递,则编译器将复制一份.
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;
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测试.