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 的所有最新版本中也是如此,直到 delphi xe;现在使用delphi xe2,我有这个输出:

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

现在我问,需要使用不同类型的字符串吗?我当然找到了解决它的解决方法,将 byte(src[iindex]) 更新为 byte(src[succ(iindex)]) 但是当 iIndex = 255 时,我有 byte(src[256]) 引发异常所以需要改变字中的字节。当然,我不认为这是最好的解决方案,所以我问你是否有更好的解决方案。非常感谢。

4

1 回答 1

6

您正在越界访问字符串。在 Delphi 中,字符串访问是从 1 开始的。您应该收到范围检查错误。另外,我认为您应该更喜欢使用chr()andord()而不是演员表。

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 回答