Ошибка проверки диапазона и Delphi 7.0 - PullRequest
5 голосов
/ 28 марта 2011

Потратив неделю на проверку и исправление моей программы на предмет утечек памяти через FastMM4, я, наконец, протестировал ее на другом ПК.Теперь я получаю «Ошибка проверки диапазона».Я потратил часы на изучение этого вопроса в Интернете, но ни один из них, похоже, не дает мне того, что я ищу.Моя программа была выполнена с опцией Runtime Error Range Range.Итак, я знаю, что именно поэтому я получаю сообщение об ошибке, но мне нужно было точно знать, почему возникает ошибка.

Программа была скомпилирована на XP с Delphi 7.0.ПК для тестирования - Windows 7. Как только он запускается, моя программа начинает обмениваться данными через последовательный порт, а затем появляются сообщения об ошибках «Проверка диапазона».Когда я прекращаю последовательную связь, я не вижу поля «Ошибка проверки диапазона».Что это значит и как мне решить эту проблему?Я ищу простую стратегию.Я знаю, что мог потратить дни на построчную проверку.

«Ошибка проверки диапазона», вызванная неправильным присвоением значений или доступом к недоступному индексу массива.Я прав?

Ответы [ 2 ]

8 голосов
/ 28 марта 2011

Ваше понимание ошибок проверки диапазона верно.Они возникают, когда вы обращаетесь к массиву за его пределами.Например:

type
  TFixedArray = array [0..41] of Integer;
var
  a: TFixedArray;
begin
  a[42] := 1+2;//!! this is a range check error !!
end;

Или для динамического массива:

var
  a: array of Integer;
begin
  SetLength(a, 666);
  a[665] := 12;//this is fine
  a[666] := 42;//!! this is a range check error !!
end;

Я проиллюстрировал это с помощью присваивания, но чтение массива с индексом за пределами также даст диапазонerror.

Ошибка диапазона должна содержать адрес, по которому она возникла, и затем вы можете преобразовать ее в кодовое место с помощью файла карты.Еще лучше было бы, если бы вы использовали madExcept или какой-то другой инструмент.


ОБНОВЛЕНИЕ

По запросу Кена документация гласит, чтоОпция проверки диапазона зависит от следующих параметров:

В состоянии {$ R +} все выражения массива и индексации строк проверяются как находящиеся в заданных границах, и все присваивания скалярам и поддиапазонампеременные проверяются в пределах диапазона.

1 голос
/ 27 октября 2017

Прочитав другую информацию о понятии «ошибка проверки диапазона», я считаю, что причина возникновения «ошибки проверки диапазона» в этом сценарии заключается в том, что: переменная, назначающая доступ к последовательному порту, который читает программа, представляет-байт (или меньший) тип, и последовательный порт, который читает программа, превышает ограничение переменной.Обратите внимание, что [когда я прекращаю последовательную связь, ячеек «Ошибка проверки диапазона» нет.], Это должно прояснить все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...