能把动态数据保存在TLIST里面么?我定义了一个动态数组:
aBuf :array of byte;setLength(aBuf,10);然后再赋值,保存到List里面,list.add(aBuf);
接着我取出来,bBuf :array of byte;bBuf := list[0];这样做问题出在哪里,好像bBuf不对呢?该怎么做呢???
aBuf :array of byte;setLength(aBuf,10);然后再赋值,保存到List里面,list.add(aBuf);
接着我取出来,bBuf :array of byte;bBuf := list[0];这样做问题出在哪里,好像bBuf不对呢?该怎么做呢???
这一句相当于把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的地址
修改办法
list.add(@aBuf); //把aBuf的地址放入list
@bBuf := list[0];//这句不能直接这样用,改为
SetLength(bBuf,10);
Move(Pointer(list[0])^,bBuff,10);
但是这样就编程复制到bBuf而非修改指向了。
反正动态数组放到tlist就怪怪的。不好处理。
Type
PRecData=^TRecData;
TRecData=Record
Data:Pointer;//数据指针
Size:Cardinal;//数据长度
end;
///////////////////////////////////////////////////////////////////////////
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.
我想问下
FDynArr: TMyDynArr;
FDynArr:array of Byte ;
这两者有什么区别?除了类型别名没别的区别吗?
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;
至于10楼的,你写的方式没错,但是你没有看清楚LZ提出的问题,以及LZ为什么会有出错的疑惑。动态数组的长度本来就是可以自己定义的,也是可以判断的,而且我也就是写一个简单的例子,理解原理就行。