但是,编译器报告“常量对象不能作为var参数传递”错误 – 尽管变量显然是一个变量.
program CurrencyConstant; {$APPTYPE CONSOLE} var GVar: Currency; begin FillChar(GVar,SizeOf(GVar),0); end.
类似地,过程中的局部变量也会出现相同的问题.
procedure TestCurrency; var LVar: Currency; begin FillChar(LVar,SizeOf(LVar),0); end;
我怀疑它与FillChar是一个编译器的魔术过程有关,Dest是一个无类型的var参数. FillChar是我遇到这个问题的唯一例子.
>什么原因导致这个问题?
>是否有其他类型受到影响?
In response to the inevitable “Why would you do that comments”: We have a code generator that uses FillChar to generically initialise record structures & primitive types. It works with everything else,but unexpectedly Failed with Currency. We do have workarounds,but it would be nice to understand the root cause,and know whether anything else is likely to cause us trouble.
编辑
从Jeroen’s answer年可以合理地得出结论,这个问题存在于德尔福的所有地方.此外,货币阵列显然也出现了类似的问题.
David’s answer提供了一些不错的解决方法.
解决方法
It still occurs in Delphi XE4.
Report No: 118866 Status: Reported
Cannot perform FillChar on Currency variables
07002
It is similar to
07003
Delphi的编译器错误的解决方法2009年:使用ZeroMemory或FillMemory从Windows单元,工作原理和FillChar.
在Delphi方面,ZeroMemory和FillMemory使用下面的FillChar,其中可能是Delphi 2006的inlined.
在C方面都使用编译器宏.
可能这个问题只发生在货币,因为这是唯一的数字编译器类型被缩放.
该问题不会以序数类型,常规浮点类型和Comp复制.
编辑:问题已在XE5 Update 2修复