没人回答呀?
我自己已经搞定了,不得不放弃使用动态数组,而改用指针数组。
不过这样一换好像效率提高了,自己也长了不少知识。使用move进行内存拷贝时最好将目的和源都强制转换pointer型,呵呵。欢迎继续讨论,别把我的分给糟蹋了。

解决方案 »

  1.   

    我看了好久,一个问题是ListBox2.Items.Add( IntToStr(rtArr.p[i]) );
    好像你的结构中没有P?第二个问题就是对于动态数组,为什么不用SetLength?
      

  2.   

    没有p是因为我打错了,把p改成arr就成了,不好意思
    我是用SetLength来设置动态数组的长度的,只是此操作与问题没太大关系,所以省略了。
      

  3.   

    动态数组是delphi中比较特殊的类型,更多的象指针,如果它放在结构中,它始终只占4字节(指针大小),如果是数组的话,则会占用相应大小的字节数,所有两者是有很大区别的.在使用它的高级用法前必须了解其原理
      

  4.   

    不是不可以,只是访问它的数据时不能通过结构简单的来完成,举例:
    type
      TRec1 = Record
        Arr: Array of Integer;
      end;
      TRec2 = Record
        Arr: Array[0..4] of Integer;
      end;
    var
      Rec1: TRec1;
      Rec2: TRec2;
    begin
      Rec1.Arr := VarArrayCreate([0,4],varInteger);
      ShowMessage(IntToStr(SizeOf(Rec1)));
      ShowMessage(IntToStr(SizeOf(Rec2)));
    end;你发现结构其实大小完全不一样了吧
      

  5.   

    另外,如何将一个Pchar拷贝到pointer中var str : PChar;
        p : pointer;我是该使用
    move(str, p^, StrLen(str));
    还是
    move(str^, p^, StrLen(str));另外读p^里的PChar时该怎么做?已经给分了
      

  6.   

    在system单元中查StringToVarArray函数的实现,那里有MOVE的例子