1

我正在将软件从 Delphi 5 迁移到 Delphi XE。我已经纠正了很多差异,现在我可以编译我的代码了。

发生的问题是有时(在代码的某些地方),我收到错误“范围检查错误”。

例如,在此代码中:

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) 但它并没有解决我的问题。我还尝试将“计数器”的类型更改为 Cardinal 和 LongWord,但没有成功

我会很高兴有任何有用的想法!

谢谢。

4

2 回答 2

5

代码应该是这样的:

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;
于 2011-01-18T15:20:58.130 回答
2

另一个问题可能是 Ori 或 Des 的输入损坏,因此如果 Davids 解决方案无法解决问题,您也应该检查调用代码。

于 2011-01-18T16:20:29.943 回答