2009-12-29 13 views
1

它让我坚持了一个小时。我恰好有一个字符串常量,其中有大约280个字符。Delphi 2009为什么不给字符串常量太长的消息?

我试图用波什找了很久字符串常量内的字符串。它在字符串长度超过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公司的程序员?

可能有人请检查是否德尔福2010现在提供了一个消息的所有字符串> = 255个字符,或者只是256个字符,而不是为那些> = 257

如果没有,我怎么去得到它在Quality Central注意到?我甚至不知道如何查看是否报告了这个问题。


谢谢你让我发泄。

科内尔的答案链接到链接到the bug report,指出它已被固定在构建14.0.3513.24210论坛讨论。


p.s.难道你不认为Embarcadero在Delphi 2009的Unicode字符串被引入时应该消除255限制吗?

回答

3

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

,并得到了不断的长度限制,使用"split longer into addition" + "of shorter strings under 255 chars"

此外,还有对德尔福支持论坛here类似的讨论。

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

至于为什么德尔福没有报告......嗯,这是一个known bug,据说已被修复,甚至有一个compiler patch

+0

是的,我知道如何解决它。这不是问题。我想我只是感到不安,德尔福没有警告我这一点,我不得不开始调试,以找到问题的根源。但是我使用了无限长的默认Unicode字符串。我的假设是德尔福2009年也会有无限长的字符串常量。将它们留在255个字符就像限制行长度到80列,因为这是计算机卡的限制。 :-P – lkessler

+0

我扩大了我的答案:) –

+0

Kornel:感谢您的安迪的IDE修订包的链接。我以前从来没有听说过。它看起来像纠正了Update 3中的一些非常严重的错误(如慢速调试)。在安装它之后,较长的字符串常量现在报告为错误。 – lkessler

0

Delphi对于字符串常量的限制为255个字符。你可以延长它的长度,我认为通过使用+一起凝聚在一起,但是基于在pascal和Delphi 1中所有字符串被限制为最多255个字符这一事实的一个非常旧的限制。

令人讨厌但很容易解决。

+0

只有Delphi 1有255个字符限制。在Delphi 2(第一个32位版本)中字符串发生了变化,以允许更长的长度。 –

+0

已更新以反映该情况。 –