【问题标题】:Cannot assign left side - Boolean(RecBuf[0]) := false无法分配左侧 - Boolean(RecBuf[0]) := false
【发布时间】:2014-10-07 13:31:37
【问题描述】:

我正在将旧代码从 Delphi 5 转换为 XE5。 它有这段代码:

Boolean(RecBuf[0]) := False;

RecBuf 是 PChar。 这在 Delphi 7 中有效,但在 XE5 中无效。 在 XE5 中,它给出“左侧无法分配”错误。 如何在 XE5 中实现这段代码?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    在 Delphi 7 中,PCharPAnsiChar 的别名。即,指向 8 位 ANSI 字符的指针。这意味着RecBuf[0] 的类型为AnsiChar。由于AnsiCharBoolean 的大小相同,因此强制转换是有效的。

    在 Delphi XE5 中,PCharPWideChar 的别名,指向 16 位宽字符的指针。所以RecBuf[0] 的类型为WideChar。因此转换无效,因为WideCharBoolean 的大小不同。

    无法从您在此处显示的代码中辨别出解决问题的最佳方法。很可能您需要重新声明RecBuf。也许它需要声明为PAnsiChar。虽然有人确实想知道为什么要将角色投射到 Boolean

    另一种可能是RecBuf 被声明为PChar 的原因是允许您使用索引运算符[],这在旧版本的Delphi 中是指向字符类型的指针的特殊功能。在现代 Delphi 中,您可以使用 {$POINTERMATH ON} 为所有类型化指针启用该功能。所以,如果你这样做了,那么RecBuf 应该是PBoolean

    最重要的是,虽然我们可以解释编译器抱怨您的代码的原因,但我们无法为您提供明确的解决方案。

    【讨论】:

      【解决方案2】:

      从 RecBuf 名称来看,它们不是用作指向字符串的指针,而是用作指向在内存中分配的缓冲区的指针。

      如果我的假设正确,您可能需要将 RecBuf 重新声明为 PByte 类型的变量。

      【讨论】:

      • 为什么是 PByte 而不是 PBoolean?
      • PChar 通常用于缓冲区定义,因为它们支持指针运算,而 Delphi 版本 docwiki.embarcadero.com/RADStudio/XE6/en/… 如果 RecBuf 总是指向具有相同结构的记录,则可能值得定义记录类型并将 RecBuf 声明为指向记录类型的指针。
      【解决方案3】:

      你不能在左边分配施法的东西,你需要施法到右边。

      代替

      Newtype(Whatever) := NewtypeConstant;
      

      你应该使用

      Whatever := TUnknown(constant)
      

      在你的情况下,recbuf 是一个字节数组,然后它会在其中放入 false (0),所以它应该是

      Recbuf[0] := Byte(False);
      

      或者你可以,你知道的,把零放在那里。

      【讨论】:

      • 不是这样。您可以转换分配的左侧值。您不能忽视 Ansi/Wide 字符差异。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多