ERangeError в Delphi XE - PullRequest
       44

ERangeError в Delphi XE

1 голос
/ 18 января 2011

Я перевожу программное обеспечение с Delphi 5 на Delphi XE. Я уже исправил множество различий и теперь могу скомпилировать свой код.

Проблема заключается в том, что иногда (в некоторых местах кода) я получаю сообщение об ошибке «Range Check Error».

Например, в этом коде:

function CopyChar(Ori : string; var Des : Array of char) : Boolean;
var Msg     : string;
    Counter : integer;
    SizeDes : integer;
begin
    SizeDes:= SizeOf(Des);
    for Counter:= 1 to SizeDes do begin
        Des[Counter-1]:= ' ';
    end;
    Ori:= Trim(Ori);
    Msg:= '';
    SizeDes:= Min(Length(Ori),SizeDes);
    for Counter:= 1 to SizeDes do begin
        Des[Counter-1]:= char(Ori[Counter]);
    end;
    CopyChar:= True;
end;

Я получаю ошибку во время выполнения при прохождении по строке Des [Counter-1]: = ''; Ошибка возникает не в первый раз, когда она проходит через цикл, а через много раз.

Я пытался отключить Rance Checking ($ R), но это не решает мою проблему. Я также пытался изменить тип "Counter" на Cardinal и LongWord, но безуспешно

Буду рад любой полезной идее!

Спасибо.

Ответы [ 2 ]

5 голосов
/ 18 января 2011

Код должен выглядеть примерно так:

function CopyChar(Ori : string; var Des : Array of char) : Boolean;
var Msg     : string;
    Counter : integer;
    LenDes  : integer;
begin
    LenDes:= Length(Des);
    for Counter:= 1 to LenDes do begin
        Des[Counter-1]:= ' ';
    end;
    Ori:= Trim(Ori);
    Msg:= '';
    LenDes:= Min(Length(Ori),LenDes);
    for Counter:= 1 to LenDes do begin
        Des[Counter-1]:= char(Ori[Counter]);
    end;
    CopyChar:= True;
end;

Я полагаю, ваша проблема в том, что Char теперь имеет ширину 2 байта (в Delphi 5 он был шириной 1 байт), хотя я никогда не использовал SizeOfв открытом массиве и даже не знаю, что он делает!

Есть несколько других проблем с этим кодом.Возвращаемое значение кажется немного бессмысленным, поскольку оно может возвращать только True.Это также может быть несколько сжато так:

procedure CopyChar(Ori: string; var Des: array of char);
var
  i: Integer;
begin
  Ori := Trim(Ori);
  for i := 1 to Length(Des) do begin
    if i<=Length(Ori) then
      Des[i-1] := Ori[i];
    else
      Des[i-1] := ' ';
  end;
end;
2 голосов
/ 18 января 2011

Другая проблема может быть из-за искаженного ввода либо Ori, либо Des, поэтому, если проблема не решена с помощью решения Davids, вам также следует проверить код вызова.

...