如何解决Range check error 错误

程晨c 2014-08-25 10:41:17


procedure TForm1.btn1Click(Sender: TObject);
var
i:int64;
x:array of int64;
intS:int64;
begin
i:=1000000000;
setlength(x,i); //此处报错
intS:=gettickcount;
Randomize;
i:=0;
while i<= high(x) do
begin
x[i]:=random(high(x)+1);
i:=i+1;
end;
intS:=gettickcount-ints;
lbl1.Caption:='用时'+inttostr(ints)+'毫秒';
end;



...全文
5964 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
缘中人 2014-08-26
  • 打赏
  • 举报
回复
跟内存大小有关
aniugee 2014-08-26
  • 打赏
  • 举报
回复
x:array of integer; 报错Range check Error x:array of smallint; 报错out of memory x:array of byte; 正常 个人理解,第一种可能是语法检查层面的错误 第二种是语法通过但分配内存时发现不足
武稀松 2014-08-25
  • 打赏
  • 举报
回复
1G个Int64也就是至少8G内存才够放. 如果你是32位操作系统至少操作系统给每个进程的内存只有2G或者3G(开了PAE模式) 如果是64位系统,你的物理内存也没这么大. 而你这里setlength报Range错主要是因为超出了动态数组的大小,动态数组32位系统最多是2G内存 neededSize := newLength*elSize;//32位系统下neededSize 是32位整数,你这个超出了最大数,就变成负数.后面那句就会抛异常. if neededSize div newLength <> elSize then Error(reRangeError);
程晨c 2014-08-25
  • 打赏
  • 举报
回复
引用 1 楼 wr960204 的回复:
1G个Int64也就是至少8G内存才够放. 如果你是32位操作系统至少操作系统给每个进程的内存只有2G或者3G(开了PAE模式) 如果是64位系统,你的物理内存也没这么大. 而你这里setlength报Range错主要是因为超出了动态数组的大小,动态数组32位系统最多是2G内存 neededSize := newLength*elSize;//32位系统下neededSize 是32位整数,你这个超出了最大数,就变成负数.后面那句就会抛异常. if neededSize div newLength <> elSize then Error(reRangeError);
x:array of int64; 报错Range check Error x:array of integer; 报错Range check Error x:array of smallint; 报错out of memory 同样是超出内存,为何前二者报 range check error 而后者报 out of memory
xiaoxian251 2014-08-25
  • 打赏
  • 举报
回复
setlength(x,i); i为Integer

16,748

社区成员

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

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