如何动态设置结构数组的长度(20分)

  • 主题发起人 主题发起人 rainee
  • 开始时间 开始时间
R

rainee

Unregistered / Unconfirmed
GUEST, unregistred user!
结构:
type
Tmy = packed record
...
end;

var aa:array[0..1000] of Tmy;

现在我想把aa换成动态数组: aa:array of Tmy, 然后在程序中动态设置它的大小,
我用SetLength(aa, 1000*sizeof(Tmy))不行, 数据读取到里面就出错.
 
SetLength(aa, 1000) 就行了。后面的 *sizeof(Tmy) 多此一举。
 
可是我这样,为什么显示出来的长度是4呢?
SetLength(aa, 1000)
showmessage(inttostr(sizeof(aa)));
 
showmessage(inttostr(length(aa)));
 
showmessage(inttostr(length(aa))) 显示的是aa的个数
但是我的数组是结构数组啊.
我的意思是:
如何在程序中使: aa:array of Tmy //Tmy是我定义的结构

等同于: aa:array[0..1000] of Tmy;
 
动态结构数组如何在程序中改变它的长度呢?
 
var
aa: array of Tmy;
begin
SetLength(aa, 10); //长度10,
.....做操作后,增加5
SetLength(aa, Length(aa) + 5);
.....做操作后,减去10
SetLength(aa, Length(aa) - 10);
end;
 
SetLength(aa, 1000) 就OK
 
可是我这样,为什么显示出来的长度是4呢?
SetLength(aa, 1000)
showmessage(inttostr(sizeof(aa)));

我认为aa只是指针,使用SetLength(aa, 1000)可以达到你要的效果
 
动态数组变量就是个指针,我觉得指针大概也是integer形的,所以它在内存中只占4个字节
 
学习......
 
sizeof(aa) 其实是sizeof(指针),当然是4了
你可以研究一下下面的函数得到什么?
High(aa)
Low(aa)
 
我的程序错误到底在哪昵?
type
Tmy = packed record
a1: word;
a2: word;
a3: word;
a4: word;
a5: word;
end;

var
aa:array of Tmy;

procedure readmyfile(filename :string);
var
F:file;
begin
assignfile(F,filename);
reset(F,1);
seek(F,0);
SetLength(aa, 500000);
BlockRead(F, aa, 500000 * SizeOf(Tmy));
CloseFile(F);
end;

程序编译正常,但运行时会出现"I/O error: 998"错误,我查了好久,我把aa改成静态数组:
aa: array[0..499999] of Tmy; 程序编译运行就正常了,这是怎么回事呢?
 
procedure readmyfile(filename :string);
var
FHandle: Integer;
begin
FHandle := FileOpen(FileName, fmOpenRead or fmShareDenyNone);
if FHandle > 0 then
try
SetLength(aa, 500000);
FileSeek(FHandle, 0, 0);
FileRead(FHandle, aa[0], 500000 * SizeOf(Tmy));
finally
FileClose(FHandle);
end;
end;

建议楼主使用以上代码。
我测试可行。
 
多人接受答案了。
 
>> FileRead(FHandle, aa[0], 500000 * SizeOf(Tmy));
这里为什么要用aa[0]? 指的是什么?
 
aa【0】就是第一个元素,起始地址
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
922
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
320
import
I
后退
顶部