【问题标题】:Delphi silently cropping string literalsDelphi 默默地裁剪字符串文字
【发布时间】:2009-03-27 12:01:46
【问题描述】:

德尔福 2009 Win32.

下面的代码尝试将 257 长度的字符串添加到备忘录中。 它编译并运行良好,但没有任何内容添加到备忘录中。

Memo1.Lines.Add('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');

看起来像一个编译器错误。是吗?因为如果字符串长度为 256,我会收到编译器错误,无法编译应用程序。

当开发者尝试做这样的事情时,有什么方法可以让应用程序崩溃?

我知道我可以拆分字符串并使这段代码工作,但我的意思是防止开发人员在不注意的情况下使用这个无效代码。

谢谢

【问题讨论】:

    标签: delphi delphi-2009


    【解决方案1】:

    这是一个带有字符串文字的 Delphi 2009 错误,它应该引发与 D2007 相同的错误。

    尝试最新版本的 Andreas IDE Fix pack,它可以修复这个错误。 http://andy.jgknet.de/blog/?page_id=246

    【讨论】:

    • 而 Andreas 不断地修复 Delphi。 :)
    • 是的,Andreas 干得不错!
    【解决方案2】:

    我同意 Gamecat,但是如果你处理的字符串那么大,我会破坏它 分成多行以帮助阅读/编辑。

    如果您真的想创建 257 个“a”,那么为什么不在 StrUtils 单元中使用 DupeString 函数呢?

    Memo.Lines.Add( DupeString('a',257) );
    

    更容易阅读和以后维护。如果您在循环中执行此操作并因此担心性能,则将函数结果分配给局部变量并使用该变量。

    var
      sLotsOfAs : string;
      ix : integer;
    begin
      sLotsOfAs := DupeString('a',257);
      for ix := 0 to 1000000 do
        Memo.Lines.Add( sLotsOfAs );
    end;
    

    【讨论】:

      【解决方案3】:

      字符串文字长度只能为 255 个字符。不知道他们为什么保留这个限制。但是您可以使用多个文字来解决它:

      Memo1.Lines.Add('i have 128 chars' + 'i also have 128 chars').
      

      【讨论】:

        【解决方案4】:

        我不知道 D2009,但至少在 Delphi 6 下,字符串字面量限制为 255 个字符,编译器会诊断错误。

        【讨论】:

        • 我相信 255 限制是由于 Delphi(无论如何都是 D2009 之前)将长度存储在字符串缓冲区的第一个字节中。 IE。 string[0] 是长度,作为一个字节可以存储 0-255。
        • 自 Delphi 2 以来的所有版本的 Delphi 都支持长字符串变量,并且不限于 255 个字符。除了,似乎,对于字符串文字!
        【解决方案5】:

        在 Delphi 2007 中,我得到:

        [DCC Error] Unit1.pas(29): E2056 String literals may have at most 255 elements
        

        在 Delphi 5 中,我得到:

        [Error] Unit1.pas(29): String literals may have at most 255 elements
        

        如果 D2009 的行为如您所描述,那么会想到两件事:

        1 - 他们扩大了字符串中字符数的限制,但 TMemo 仍然只能接受最多 255 个。

        2 - 这是一个普通的老错误

        就防止它而言,我唯一能想到的就是制作一个正则表达式来搜索您的 .PAS 文件中的这些字符串。

        【讨论】:

        • 根据 Cesar Romero 的回答...您是否安装了 IDE Fix pack?
        • 我怀疑他是否安装了 2.6 Beta 1,因为这是全新的,直到 Cesar Romero 在此处发布链接后才向公众开放。
        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 2020-11-24
        • 2019-10-03
        相关资源
        最近更新 更多