能把动态数据保存在TLIST里面么?我定义了一个动态数组:
aBuf :array of byte;setLength(aBuf,10);然后再赋值,保存到List里面,list.add(aBuf);
接着我取出来,bBuf :array of byte;bBuf := list[0];这样做问题出在哪里,好像bBuf不对呢?该怎么做呢???

解决方案 »

  1.   

    tlist里保存的是指针,并且还要看你那个数组是局部的还是全局的。
      

  2.   

    1. 因为动态内存在堆里面分配内存,因此局部还是全局在此处不影响2. list.add(aBuf);
    这一句相当于把aBuf[0]~aBuf[3]的内容合并为一个32为的地址放入list
    因为:
    list里面放的是指针,aBuf是引用不是指针,引用直接表示值本身,而aBuff又是byte类型的数组 1Pointer = 1Longword = 4Byte)3. bBuf := list[0];
    这一句相当于把aBuf[0]~aBuf[3]放入bBuf,但是aBuf[4]~aBuf[9]没有放入修改办法
    list.add(@aBuf); //把aBuf的地址放入list
    @bBuf := list[0]; //bBuf的地址设置为和aBuf的地址
      

  3.   

    上面说错了。
    修改办法
    list.add(@aBuf); //把aBuf的地址放入list
    @bBuf := list[0]; //这句不能直接这样用,
    改为
    SetLength(bBuf,10);
    Move(Pointer(list[0])^,bBuff,10);
    但是这样就编程复制到bBuf而非修改指向了。
    反正动态数组放到tlist就怪怪的。不好处理。
      

  4.   

    你应该定义一个结构指针,用来保存你的数据再加进去。比如:
    Type
      PRecData=^TRecData;
      TRecData=Record
        Data:Pointer;//数据指针
        Size:Cardinal;//数据长度
      end;
      

  5.   

    LZ你理解错了,TList[I]表明了TList是类似数组的,其实其实现跟动态数组是类似的,AList.Add(X)表明添加了一个元素。动态数组名本来就是一个指针,所以,你取出来的元素也就是一个指向动态数组的指针,而不是你认为的添加一个动态数组,就是可以用List[i]这样来访问,你要关注的是,你添加的到底是什么。这样的理解是错误的
      

  6.   

    我写了一个例子,LZ可以参考参考
    ///////////////////////////////////////////////////////////////////////////
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMyDynArr = array of Byte;
      TForm1 = class(TForm)
        btn1: TButton;
        btn2: TButton;
        mmo1: TMemo;
        procedure btn1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
        FLst: TList;
        FDynArr: TMyDynArr;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
    var
      i: Integer;
    begin
      SetLength(FDynArr, 10);
      for i := 0 to 9 do
        FDynArr[i] := i;
      FLst.Add(FDynArr);
      //FreeAndNil(ALst);
      //ADynArr := nil;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FLst := TList.Create;
      SetLength(FDynArr, 100);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FreeAndNil(FLst);
    end;procedure TForm1.btn2Click(Sender: TObject);
    var
      ADynArr: TMyDynArr;
      i: Integer;
    begin
      ADynArr := TMyDynArr(FLst[0]);
      for i := 0 to 9 do
        mmo1.Lines.Add(IntToStr(i));
    end;end.
      

  7.   


    我想问下
    FDynArr: TMyDynArr;
    FDynArr:array of Byte ;
    这两者有什么区别?除了类型别名没别的区别吗?
      

  8.   

    3、4L 根本就把动态数组当作定长数组了,完全是错的。
    8L 的代码也是错的,而且跟前面的比起来,更糟糕的是数组不够长时不容易表现出来。
    动态数组和 string 是非常像的,都由引用管理数组的释放。对于初学者来说,可能最容易掌握的方式还是像这样:type
      TBytes = array of Byte;
      PBytes = ^TBytes;var
      pbuf: PBytes;
    begin
      New(pbuf);
      SetLength(pbuf^, ...);
      ...
      list.Add(pbuf);
    end;var
      pbuf: PBytes;
    begin
      pbuf := list[n];
      ...
      Dispose(pbuf);
    end;
      

  9.   

    是这样的,FDynArr: TMyDynArr;定义了一个类型,作为一个类型,你可以定义很多的变量;但是FDynArr:array of Byte ;这样做的话只是定义了一个以Byte为类型的动态数组类型的变量。建议使用第一种方式,要知道,如果在方法中传递地址的方式传参数的话,类型是要统一的,所以,定义一个类型比较好。
    至于10楼的,你写的方式没错,但是你没有看清楚LZ提出的问题,以及LZ为什么会有出错的疑惑。动态数组的长度本来就是可以自己定义的,也是可以判断的,而且我也就是写一个简单的例子,理解原理就行。