Delphi · 2025年5月14日

Delphi Range check error

今天编程的时候踩了一个大坑,说是大坑,准确的说其实是阴沟里翻船

一般说来 Range check error 这个异常的出现,经常出现在数组等越界访问的时候;今天恰好也是在TBytes的for循环使用中出现,所以一只认为是访问越界导致的问题,于是苦苦寻找是哪里引起的问题,甚至后来开始怀疑因内存越界导致的异常释放导致的问题, 整整搞了好几个小时,累了,中午吃了饭休息一下~

下午来又继续调试,难道是Linux下才有的问题?于是切换回Windows,问题还是一样~郁闷!!网上说关闭检测就可以了

Projcect->Option->Complier->Runtime Errors->Range Checking 去掉勾选 即可; 弄了后果然可以了,这个感觉不是越界引起的问题呢~

每次都可以在固定位置出现,不管是否打断点都是,这种也不像是内存越界导致的问题,到底是什么问题?

最后仔细看了看代码,直接大跌眼镜; 确实是越界; 下面是代码

var
  _byte : byte;
  _Bytes : TBytes;
  i : integer;
begin
  setlength(_Bytes, 10);
  _byte := 0;
  //这里是给_Bytes 进行随机赋值
  for i = 0 to length(_Bytes) - 1 do
  begin
    _byte := _byte + _Bytes[i];
  end;  
end;  
Pascal

最后确定应该是给byte赋值时出现的问题;因为两个Byte相加可能引起进位,没错,就这个原因;于是按下面改

var
  _byte : byte;
  _Bytes : TBytes;
  i : integer;
begin
  setlength(_Bytes, 10);
  _byte := 0;
  //这里是给_Bytes 进行随机赋值
  for i = 0 to length(_Bytes) - 1 do
  begin
    _byte := Byte(_byte + _Bytes[i]);   //这个地方进行了一个Byte的强制转换; 
  end;  
end;  
Pascal

哎~~ 兜兜转转一大圈,在阴沟里的大坑中狠狠摔了一跤~~