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原来的空间是不是没有回收?如果发生了泄漏,我应该怎么改呢?另外,不知道这段程序还有什么地方不好,请大家多多指出。

解决方案 »

  1.   

    会得,但是不发生内存泄漏(如果发生,那么是Borland的错,而不是你的错)。
    因为动态数组是由Delphi动态管理内存的,而无需你担心,Delphi会在适当的时候释放它的。这个如同Delphi的String。
      

  2.   

    谢谢
    进一步讨论,如果将XSequence.inverseOfSequence改成一个procedure,返回值作为一个var参数来使用,会有什么区别呢?会不会更好一些?
      

  3.   

    最重要的是重复运算中的代码不要出现没有效率。
    比如:

    for (i=0; i<10000; ++i)
    {
       Dc = GetDC();
       //...
    }

    Dc = GetDC();
    for (i=0; i<10000; ++i)
    {
       //...
    }
    这两句性能上就差了非常多。
      

  4.   

    这又是怎么回事?class function XSequence.SequeToString(A: Xarray; i: integer): String;
    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等都没有问题。
    怎么回事?怎么办?