0

私はこの問題を抱えています、この例のコードを見てください:

src := '';
for iindex := 0 to 255 do
  begin
    src := src + char(byte(iindex));
    writeln (iindex:5, byte(src[iindex]):5);
  end;

ここで、src は文字列型で、iindex は整数型であり、出力として次のようなものが必要です。

iIndex   byte(src[iIndex])
 0         0
 1         1
 2         2
 3         3
 ..................
 254       254
 255       255   

そして、delphi xe までのすべての最後のバージョンの delphi でも同様でした。今デルファイxe2で、私はこの出力を持っています:

iIndex   byte(src[iIndex])
 0         0
 1         0
 2         1
 3         2
 ..................
 254       253
 255       254   

今、私は尋ねます、異なるタイプの文字列を使用する必要がありますか? もちろん、バイト(src [iindex])をバイト(src [succ(iindex)])に更新して解決するための回避策を見つけましたが、iIndex = 255の場合、例外を発生させるバイト(src [256])がありますしたがって、バイト単位で変更する必要があります。もちろん、それが最善の解決策だとは思わないので、もっと良い解決策があればお願いします。どうもありがとう。

4

1 に答える 1

6

範囲外の文字列にアクセスしています。Delphiでは文字列アクセスは1ベースです。範囲チェックエラーが発生するはずです。また、キャストの代わりにchr()とを使用することをお勧めします。ord()

src := '';
for iindex := 0 to 255 do
begin
  src := src + chr(iindex);
  writeln (iindex:5, ord(src[iindex+1]):5);
end;

以前のバージョンのDelphiでコードが機能する可能性があるとは思いません。実際、Delphi 2010は、範囲チェックが無効になるとXE2が動作することを説明したとおりに動作します。これは、範囲チェックが非常に価値がある理由のさらに別の例です。

于 2011-09-20T09:59:55.377 に答える