type
XArray = array of integer;class function XSequence.inverseOfSequence(A: XArray; i: integer): XArray;
var
j: integer;
B: XArray;
begin
setLength(B,i); for j:= 1 to i do
begin
B[A[j-1]-1]:= j;
end; Result:= B;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i,j: integer;
A,B,C,D: XArray;
begin
i:= 5; SetLength(A,i); // (1) Randomize(); XSequence.randomizeSequence(A,i);//设置随机的初值
XSequence.randomizeSequence(B,i);//设置随机的初值
A:= XSequence.inverseOfSequence(B,i); // <==== (2)
end;在下初学Delphi,很多地方弄不透,但又很难快速找到资料,盼大家指点一二。A的空间是在(1)处分配的,那么在(2)处会不会使A对应其他的空间?那么这样A原来的空间是不是没有回收?如果发生了泄漏,我应该怎么改呢?另外,不知道这段程序还有什么地方不好,请大家多多指出。
XArray = array of integer;class function XSequence.inverseOfSequence(A: XArray; i: integer): XArray;
var
j: integer;
B: XArray;
begin
setLength(B,i); for j:= 1 to i do
begin
B[A[j-1]-1]:= j;
end; Result:= B;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i,j: integer;
A,B,C,D: XArray;
begin
i:= 5; SetLength(A,i); // (1) Randomize(); XSequence.randomizeSequence(A,i);//设置随机的初值
XSequence.randomizeSequence(B,i);//设置随机的初值
A:= XSequence.inverseOfSequence(B,i); // <==== (2)
end;在下初学Delphi,很多地方弄不透,但又很难快速找到资料,盼大家指点一二。A的空间是在(1)处分配的,那么在(2)处会不会使A对应其他的空间?那么这样A原来的空间是不是没有回收?如果发生了泄漏,我应该怎么改呢?另外,不知道这段程序还有什么地方不好,请大家多多指出。
因为动态数组是由Delphi动态管理内存的,而无需你担心,Delphi会在适当的时候释放它的。这个如同Delphi的String。
进一步讨论,如果将XSequence.inverseOfSequence改成一个procedure,返回值作为一个var参数来使用,会有什么区别呢?会不会更好一些?
比如:
在
for (i=0; i<10000; ++i)
{
Dc = GetDC();
//...
}
和
Dc = GetDC();
for (i=0; i<10000; ++i)
{
//...
}
这两句性能上就差了非常多。
var
s: String;
j: integer;
begin
s:= '(';
for j:= 1 to i do
begin
s:= s + IntToStr(A[j-1]);
if j <> i then
s:= s + ', '
else
s:= s + ')';
end; Result:= s;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
A: XArray;
s: String;
begin
i:= StrToInt(Edit1.Text);
SetLength(A,i); // (1)
Randomize();
XSequence.randomizeSequence(A,i);//设置随机的初值 s:= XSequence.SequeToString(A,i); // <=====???end;只有在i=8时候,这条语句调用有问题,“Access violation at address 00401c1a in module ' Project1.exe'. Write of address 00430468”、“Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'”
在i=5、6、7、9、10、11等都没有问题。
怎么回事?怎么办?