Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Борьба с Range Check Error при использовании B-Tree Filer в Delphi XE2

Delphi , Синтаксис , Деревья

Борьба с Range Check Error при использовании B-Tree Filer в Delphi XE2

При переходе с Delphi 2007 на XE2 у некоторых разработчиков возникла проблема с Range Check Error при использовании B-Tree Filer. В данной статье мы рассмотрим, как справиться с этой проблемой и продолжить использовать B-Tree Filer в Delphi XE2.

Описание проблемы

После перехода на Delphi XE2 код, который ранее работал без ошибок, начал выдавать Range Check Error при обращении к переменной Page.ItemsOnPage в функции IsamUnPack. Это происходит из-за того, что в некоторых случаях значение Page.ItemsOnPage может быть равно нулю, что приводит к превышению допустимого диапазона индекса массива.

Решение проблемы

Для устранения Range Check Error можно воспользоваться следующими способами:

  1. Выключить проверку диапазона

Одним из решений является отключение проверки диапазона значений переменных. Для этого можно добавить директиву {$R-} в файл BTDEFINE.INC. Однако, этот способ небезопасен, так как может привести к неочевидным ошибкам в коде.

{$IFDEF VER230}
{$DEFINE UsingDelphi}
{$ENDIF}

{$IFDEF VER230} {Delphi XE2}
{$A-} {align data on byte boundaries}
{$B-} {short circuit boolean evaluation}
{$H+} {long string support}
{$I-} {suppress I/O checking}
{$J+} {writeable typed constants}
{$P-} {do not allow open string parameters}
{$Q-} {overflow checking off}
{$R-} {range checking off} {<--- Включаем это для отключения проверки диапазона}
{$T-} {no type checked pointers with @}
{$V-} {no var string checking}
{$X+} {extended syntax on}
{$DEFINE Delphi2006}
{$DEFINE Delphi1Plus}
{$DEFINE Delphi2Plus}
{$DEFINE Delphi3Plus}
{$DEFINE Delphi4Plus}
{$DEFINE Delphi5Plus}
{$DEFINE Delphi6Plus}
{$DEFINE Delphi7Plus}
{$DEFINE Delphi2005Plus}
{$DEFINE Delphi2006Plus}
{$ENDIF}
  1. Изменить логику кода

Вместо отключения проверки диапазона, можно изменить логику кода таким образом, чтобы избежать обращения к индексу массива с нулевым значением. Для этого можно добавить проверку условия Page.ItemsOnPage > 0 перед началом цикла.

procedure IsamUnPack(var Page : IsamPage; KeyL : Word);
var
  I, K, S : Word;
  P       : Array [0..0] Of Byte absolute Page; {Real bounds [0..65535]}
begin
  K := KeyL + 9;
  S := Pred (Page.ItemsOnPage) * K + 6;
  if KeyL <> MaxKeyLen then begin
    if Page.ItemsOnPage > 0 then {<--- Добавляем проверку условия}
      for I := Page.ItemsOnPage downto 2 do begin
        Move(P[S], Page.ItemArray[I], K);
        S := S - K;
      end;
  end;
end;

Заключение

При использовании B-Tree Filer в Delphi XE2 может возникнуть проблема с Range Check Error. Для устранения этой проблемы можно воспользоваться одним из двух способов: отключить проверку диапазона значений переменных или изменить логику кода для избежания обращения к индексу массива с нулевым значением. В любом случае, важно тщательно протестировать код после внесения изменений, чтобы избежать других возможных ошибок.

Создано по материалам из источника по ссылке.

Статья описывает проблему Range Check Error при использовании B-Tree Filer в Delphi XE2 и предлагает два способа ее решения: отключение проверки диапазона значений переменных или изменение логики кода для избежания обращения к индексу массива с нулевым зн


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Деревья ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:33:21/0.0056450366973877/1