delphi - 为什么 Delphi 2009 不为太长的字符串常量提供消息?

标签 delphi string delphi-2009 compiler-errors constants

它让我困了一个小时。我碰巧有一个包含大约 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 个字符提供消息。

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

谢谢你让我发泄。

Kornel 的回答链接到一个论坛讨论,该讨论链接到 the bug report,表示它已在构建 14.0.3513.24210 中修复。

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

最佳答案

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

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

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

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

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

关于delphi - 为什么 Delphi 2009 不为太长的字符串常量提供消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973110/

相关文章:

Delphi 7 继续使用旧的过时的形式

delphi - TImageList.ShareImages-如何准确使用而不必复制内容?

android - Delphi Firemonkey 同时从图库中选择多张图片

delphi - Indy 10 + XE8 长文件名分段上传

windows - 为什么 ReadDirectoryChangesW 会忽略事件?

delphi - TImage和TScrollBox的问题

c - 将字符串返回到需要在屏幕上打印的 C 程序形式的 Bash 脚本

c# - 在 C# 中用复杂的语法解析逗号分隔的字符串

c - C 中随机名称按字母顺序排序

delphi - 升级到 Delphi 2009/2010 还是购买软件保障更有意义?