小问题一个 (50分)

Z

zdwrq

Unregistered / Unconfirmed
GUEST, unregistred user!
动态数组最大有多大,以下的代码在我的机器上i不到8000就会
“out of memory”,256M的内存!!用固定数组也一样,但我用StringGrid里面
的Cells数组可以到3万左右,Why?有没有解决办法,我需要一个很
大的数组,10万以上,请大家帮忙!

procedure TForm1.Button1Click(Sender: TObject);
type
rdAA=record
a1,a2,a3,a4,a5:String;
end;
var
arAA:array of rdAA;
i:integer;
begin
for i:=1 to 1000000 do
begin
SetLength(arAA,i);
arAA[i-1].a1:='AAAAAAAAAAAAA';
arAA[i-1].a2:='AAAAAAAAAAAAA';
arAA[i-1].a3:='AAAAAAAAAAAAA';
arAA[i-1].a4:='AAAAAAAAAAAAA';
arAA[i-1].a5:='AAAAAAAAAAAAA';
Caption:=IntToStr(i);
end;
end;
 
这段代码在我这里没问题啊!
 
最大空间为一个Integer能表达的大小。
 
肯定有问题的,到目前为止我还没有发现在那台机器上会正常,
请你们试一下,告诉我结果吧!先谢了!
 
你要想知道是否真的内存不够,试试这样:
procedure TForm1.Button1Click(Sender: TObject);
type
rdAA=record
a1,a2,a3,a4,a5:String[20];
end;
var
arAA:array of rdAA;
i:integer;
begin
SetLength(arAA,1000000);
{ for i:=1 to 1000000 do
begin
arAA[i-1].a1:='AAAAAAAAAAAAA';
arAA[i-1].a2:='AAAAAAAAAAAAA';
arAA[i-1].a3:='AAAAAAAAAAAAA';
arAA[i-1].a4:='AAAAAAAAAAAAA';
arAA[i-1].a5:='AAAAAAAAAAAAA';
Caption:=IntToStr(i);
end;}
end;
 
我刚才试了一下,的确会Out Of Memory。
我想是不是SetLength写在循环体里面的原因?
循环中上次SetLength的内存没有释放,而重新又分配了内存?
你把SetLength放到循环体外一次性设置大小试试:
SetLength(arAA,1000000);
for ...
 
to:叮叮当当
我用固定数组也一样的[:(][:(]
 
使用TStringList
 
我把SetLength放在循环外面,900000都没事,1000000就会out of memory
就在执行完SetLength的时候就会Out of memory.
对了,我是64M内存哦,还是win2000server,还开了5个IE,非常非常慢
 
用 TList 对象吧,定义自己的数据结构让 TList 替你管理
 
TO: SupermanTm
TList好像不能管理record?只能管理TObject类型吧?
管理自定义数据类型比如下面这种好像就不行:
TMyRecord = record
N: Integer;
S: string;
end;
 
TList 的 Items 成员是 Pointer,那你的数据应该是这样的

type
PMyRecord = ^TMyRecord;
TMyRecord = record
N: Integer;
S: String;
end;
var
MyRecords: TList;

function GetRecID: Integer;
var
P: PMyRecord;
begin
New(P);
Result:= MyRecords.Add(P);
end;
引用你的数据使用:MyRecords[x]^

当然,程序开始时需要创建 MyRecords 对象(MyRecords:= TList.Create)
程序结束时应用下面程序段:
var
I: Integer;
begin
for I:= MyRecords.Count - 1 downto 0 do begin
Dispose(MyRecords);
MyRecords.Delete(I);
end;
end;
 
To: SupermanTm
感谢你的释疑!
不过我发现指针可以直接引用对象的成员,比如访问MyRecords[x]^的属性、方法、事件并不一定要加^,直接用MyRecords[x].就可以。不知道Delphi6是不是有这样一种默契,如果说得不对还请指教!
 
糟了,TMyRecord被加入TList后,访问它的属性就得象下面这么麻烦了:
TMyRecord(MyRecords[0]^).N
 
你想简单就给它封装成一个对象嘛
 
用TStringList中的addobject来达到目的,object就是个指针。
梢做处理就可以用来保存记录了
 
To: SupermanTm
看来只能这么办了,本来想到用TList也是为了偷懒,这回反而弄僵了。[:D]
 

Similar threads

S
回复
0
查看
987
SUNSTONE的Delphi笔记
S
S
回复
0
查看
805
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部