【问题标题】:Delphi XE2 and Char/Byte typeDelphi XE2 和 Char/Byte 类型
【发布时间】:2011-11-20 22:36:25
【问题描述】:

我有这个问题,看看这个例子的代码:

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]) 引发异常所以需要改变字中的字节。 当然,我不认为这是最好的解决方案,所以我问你是否有更好的解决方案。 非常感谢。

【问题讨论】:

  • src 是如何声明的?无论如何,您肯定是想写ord(src[iIndex]) 而不是byte(...)
  • src 被声明为: var src: string;如果我在字节位置使用 ord,结果很糟糕,我有 0、255、1 等,而不是 0、1、2,索引分别为:0、1、2。
  • @david:使用 ord(src[iIndex]) 我有:0 代表 iIndex = 0; 255 代表 iIndex = 1; iIndex 2 为 0;等等等等.. 对于 iIndex = 255 我有 253. 糟糕 :( 一些想法?

标签: delphi delphi-xe2


【解决方案1】:

您正在越界访问字符串。在 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 行为完全相同。这是范围检查为何如此有价值的又一个例子。

【讨论】:

  • 非常感谢。所以工作。直到 delphi xe 我已经将每个使用的字符/字节转换为 chr/ord 的位置并且一切正常。再次感谢:)
  • @Marcello 真正的问题是索引并注意 XE2 处理此代码似乎没有什么不同。
  • 是的,确实如此。我讲述了我开始发布的原始代码。实际上,在delphi xe下,它就这样,没有给我问题。从这个意义上说,我告诉了我,但现在我已经更好地理解了我错误的地方:)
  • 如果没有“问题”,这意味着你很幸运。 src[0] 总是无效的,但碰巧返回了您期望的值。我只是想知道你是如何从字符串的第一个索引中得到 1 的。
猜你喜欢
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2012-03-24
  • 2010-09-10
  • 2011-12-31
  • 2023-03-11
  • 2012-05-17
相关资源
最近更新 更多