1

ソフトウェアをDelphi5からDelphiXEに移行しています。私はすでに多くの違いを修正しました、そして今私は私のコードをコンパイルすることができます。

発生する問題は、(コードの一部の場所で)「範囲チェックエラー」というエラーが発生する場合があることです。

たとえば、このコードでは次のようになります。

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]:='';の行を渡すと、実行時にエラーが発生します。エラーは、最初にループを通過したときではなく、何度も発生した後に発生します。

ランスチェック($ R)を無効にしようとしましたが、問題は解決しません。また、「Counter」のタイプを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

もう1つの問題は、OriまたはDesの入力が破損している可能性があるため、Davidsソリューションで問題が解決されない場合は、呼び出し元のコードも確認する必要があります。

于 2011-01-18T16:20:29.943 に答える