Delphi 无法分配左侧-布尔值(RecBuf[0]):=false

Delphi 无法分配左侧-布尔值(RecBuf[0]):=false,delphi,Delphi,我正在将一个旧代码从Delphi5转换为XE5。 它有一段代码: Boolean(RecBuf[0]) := False; RecBuf是PChar。 这在Delphi7中有效,但在XE5中无效。 在XE5中,它给出了“左侧无法分配”错误。 如何在XE5中实现此代码?在Delphi7中,PChar是PAnsiChar的别名。也就是说,指向8位ANSI字符的指针。这意味着RecBuf[0]具有类型AnsiChar。由于AnsiChar和Boolean具有相同的大小,因此强制转换是有效的 在del

我正在将一个旧代码从Delphi5转换为XE5。 它有一段代码:

Boolean(RecBuf[0]) := False;
RecBuf是PChar。 这在Delphi7中有效,但在XE5中无效。 在XE5中,它给出了“左侧无法分配”错误。
如何在XE5中实现此代码?

在Delphi7中,
PChar
PAnsiChar
的别名。也就是说,指向8位ANSI字符的指针。这意味着
RecBuf[0]
具有类型
AnsiChar
。由于
AnsiChar
Boolean
具有相同的大小,因此强制转换是有效的

在delphixe5中,
PChar
PWideChar
的别名,指针指向16位宽的字符。因此,
RecBuf[0]
具有类型
WideChar
。因此,强制转换无效,因为
WideChar
Boolean
的大小不同

从您在这里展示的代码中无法看出如何最好地解决问题。很可能您需要重新声明
RecBuf
。也许它需要声明为
PAnsiChar
。尽管有人想知道为什么要将一个字符强制转换为
Boolean

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


底线是,虽然我们可以解释为什么编译器会抱怨您的代码,但我们无法给您一个明确的解决方案。

从RecBuf名称判断,它们不是用作字符串的指针,而是用作内存中分配的缓冲区的指针


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

您不能在左侧分配cast stuff,您需要在右侧进行cast

而不是

Newtype(Whatever) := NewtypeConstant;
你应该使用

Whatever := TUnknown(constant)
在你的例子中,of recbuf是一个数组,比如说byte,然后它在其中放入false(0),所以它应该是

Recbuf[0] := Byte(False);

或者你可以,你知道,把零放进去。

不是这样。您可以强制转换赋值的左侧值。您不能忽略Ansi/Wide字符的差异。为什么使用PByte而不是PBoolean?PChar经常用于缓冲区定义,因为它们支持指针算法,而Delphi版本<2009中的其他指针类型则不支持。将PChar从PAnsiChar更改为PWideChar后,delphi手册建议改为使用PByte:如果RecBuf始终指向具有相同结构的记录,则可能需要定义记录类型并将RecBuf声明为指向记录类型的指针。