TList和动态数组

longshine 2011-08-14 02:47:46
能把动态数据保存在TLIST里面么?我定义了一个动态数组:
aBuf :array of byte;setLength(aBuf,10);然后再赋值,保存到List里面,list.add(aBuf);
接着我取出来,bBuf :array of byte;bBuf := list[0];

这样做问题出在哪里,好像bBuf不对呢?该怎么做呢???
...全文
213 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainychan2009 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wangwei244157887 的回复:]

引用 8 楼 rainychan2009 的回复:

我写了一个例子,LZ可以参考参考
///////////////////////////////////////////////////////////////////////////
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Cl……
[/Quote]
是这样的,FDynArr: TMyDynArr;定义了一个类型,作为一个类型,你可以定义很多的变量;但是FDynArr:array of Byte ;这样做的话只是定义了一个以Byte为类型的动态数组类型的变量。建议使用第一种方式,要知道,如果在方法中传递地址的方式传参数的话,类型是要统一的,所以,定义一个类型比较好。
至于10楼的,你写的方式没错,但是你没有看清楚LZ提出的问题,以及LZ为什么会有出错的疑惑。动态数组的长度本来就是可以自己定义的,也是可以判断的,而且我也就是写一个简单的例子,理解原理就行。
Seamour 2011-08-15
  • 打赏
  • 举报
回复
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;

「已注销」 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 rainychan2009 的回复:]

我写了一个例子,LZ可以参考参考
///////////////////////////////////////////////////////////////////////////
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ……
[/Quote]

我想问下

FDynArr: TMyDynArr;
FDynArr:array of Byte ;


这两者有什么区别?除了类型别名没别的区别吗?
rainychan2009 2011-08-15
  • 打赏
  • 举报
回复
我写了一个例子,LZ可以参考参考
///////////////////////////////////////////////////////////////////////////
unit Unit1;

interface

uses
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.
rainychan2009 2011-08-15
  • 打赏
  • 举报
回复
LZ你理解错了,TList[I]表明了TList是类似数组的,其实其实现跟动态数组是类似的,AList.Add(X)表明添加了一个元素。动态数组名本来就是一个指针,所以,你取出来的元素也就是一个指向动态数组的指针,而不是你认为的添加一个动态数组,就是可以用List[i]这样来访问,你要关注的是,你添加的到底是什么。这样的理解是错误的
wzwcn 2011-08-14
  • 打赏
  • 举报
回复
你应该定义一个结构指针,用来保存你的数据再加进去。比如:
Type
PRecData=^TRecData;
TRecData=Record
Data:Pointer;//数据指针
Size:Cardinal;//数据长度
end;
hongss 2011-08-14
  • 打赏
  • 举报
回复
「已注销」 2011-08-14
  • 打赏
  • 举报
回复
上面说错了。
修改办法
list.add(@aBuf); //把aBuf的地址放入list
@bBuf := list[0]; //这句不能直接这样用,
改为
SetLength(bBuf,10);
Move(Pointer(list[0])^,bBuff,10);
但是这样就编程复制到bBuf而非修改指向了。
反正动态数组放到tlist就怪怪的。不好处理。


「已注销」 2011-08-14
  • 打赏
  • 举报
回复
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的地址

山东蓝鸟贵薪 2011-08-14
  • 打赏
  • 举报
回复
占个位置学习学习
浩南_哥 2011-08-14
  • 打赏
  • 举报
回复
tlist里保存的是指针,并且还要看你那个数组是局部的还是全局的。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧