如何解决Range check error 错误

时间:2022-08-03 20:22:40


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;


如何解决Range check error 错误

5 个解决方案

#1


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);

#2


setlength(x,i);  i为Integer

#3


引用 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

#4


x:array of integer;    报错Range check Error
x:array of smallint;  报错out of memory
x:array of byte;  正常

个人理解,第一种可能是语法检查层面的错误
第二种是语法通过但分配内存时发现不足

#5


跟内存大小有关

#1


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);

#2


setlength(x,i);  i为Integer

#3


引用 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

#4


x:array of integer;    报错Range check Error
x:array of smallint;  报错out of memory
x:array of byte;  正常

个人理解,第一种可能是语法检查层面的错误
第二种是语法通过但分配内存时发现不足

#5


跟内存大小有关