【问题标题】:Why Doesn't Delphi 2009 Give A Message For A String Constant that is Too Long?为什么 Delphi 2009 不为过长的字符串常量提供消息?
【发布时间】:2009-12-29 05:46:10
【问题描述】:

我被困了一个小时。我碰巧有一个字符串常量,里面有大约 280 个字符。

我试图使用 Pos 在长字符串常量中查找子字符串。当字符串长于 255 个字符时它给出结果 0,但当字符串较短时给出正确的结果。

例如:

pos('5', '123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.12345')

包含 255 个字符正确返回数字 5。

pos('5', '123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456')

包含 256 个字符会导致编译器错误: [DCC 错误] E2056 字符串文字最多可以有 255 个元素。

pos('5', '123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.1234567')

但 257 个或更多字符不会产生任何消息,并错误地返回数字 0。

这让我有一阵子大打出手。

我还发现对字符串的简单赋值也是如此,例如:

S1 :='123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456';

给出该错误消息并且不会编译。

但是再添加一个字符,S1 被分配了一个空字符串。

是否应该打开 Delphi 选项来警告我这一点,或者这只是 Embarcadero 程序员的“错误”?

有人可以检查一下 Delphi 2010 现在是否为所有 >= 255 个字符的字符串或仅 256 个字符而不是 >= 257 个字符提供消息。

如果没有,我该如何在 Quality Central 引起注意?我什至不知道如何查看是否已报告该问题。


感谢您允许我发泄。

Kornel 的回答链接到一个论坛讨论,该讨论链接到 the bug report,它说它已在版本 14.0.3513.24210 中得到修复。


附言当 Delphi 2009 的 Unicode 字符串被引入时,您不认为 Embarcadero 应该取消 255 的限制吗?

【问题讨论】:

    标签: delphi string delphi-2009 compiler-errors constants


    【解决方案1】:

    您使用的是 AnsiStrings 还是 ShortStrings? ShortStrings(字符串)有长度上限,AnsiStrings 没有(它们以空值结尾)。或者,您是否尝试过使用{$H+}(默认为 AnsiStrings)进行编译?

    要超过常量的长度限制,请使用"split longer into addition" + "of shorter strings under 255 chars"。

    此外,Delphi 支持论坛here 上也有类似的讨论。

    我认为文字不能更长的原因是因为编译器将它们存储为短字符串(而不是在堆上分配它们),因此这里有一个字节大小的长度限制。

    至于为什么 Delphi 不报告它……嗯,它是一个 known bug,据说已经修复,甚至还有一个 compiler patch。

    【讨论】:

    • 是的,我知道如何解决它。这不是问题。我想我只是对 Delphi 没有警告我这一点感到不安,我不得不开始调试以找到问题的根源。但我使用的是无限长度的默认 Unicode 字符串。我的假设是 Delphi 2009 也会有无限长度的字符串常量。将它们保留为 255 个字符就像将行长限制为 80 列,因为这就是计算机卡的限制。 :-P
    • Kornel:感谢您提供指向 Andy 的 IDE Fix Pack 的链接。我以前从未听说过。看起来它纠正了更新 3 中的一些非常严重的错误(如调试缓慢)。安装后,较长的字符串常量现在报告为错误。
    • 我希望看到一些证据证明您声称编译器将字符串文字存储在 ShortStrings 中。字符串文字可以包含任何 Unicode 字符,但 ShortString 不能。
    【解决方案2】:

    Delphi 的字符串常量限制为 255 个字符。我认为您可以通过使用 + 连接在一起来使其更长,但这是一个非常古老的限制,因为在 pascal 和 Delphi 1 中,所有字符串都被限制为最多 255 个字符。

    烦人但很容易解决。

    【讨论】:

    • 只有 Delphi 1 有 255 个字符的限制。 Delphi 2(第一个 32 位版本)中更改了字符串以允许更长的长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2010-09-21
    • 2023-04-06
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多