以下代码应该编译并使用许多其他类型进行编译 但是,编译器报告“Constant对象不能作为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
是我发现此问题的唯一例程。
回应不可避免的“你为什么要这样做”:我们有一个代码生成器,它使用FillChar来一般地初始化记录结构&原始类型。它适用于其他一切,但出乎意料地失败了货币。我们确实有解决方法,但了解根本原因会很好,并知道是否还有其他因素可能会给我们带来麻烦。
从Jeroen's answer可以合理地得出结论,这个问题存在于德尔福的所有部分中。此外,货币阵列显然也出现了类似的问题。
David's answer提供了一些不错的解决方法。
要考虑的最后一个解决方法是,修改生成器以处理Currency作为特例并简单地设置Value := 0
。
答案 0 :(得分:8)
导致问题的原因是什么?
编译器错误。请提交质量控制报告。
是否有其他类型受到影响?
也许。试着找一些。
至于解决方法,我会这样写:
FillChar(Pointer(@LVar)^, SizeOf(LVar), 0);
或者可能是这样的:
ZeroMemory(@LVar, SizeOf(LVar));
甚至是这样:
LVar := Default(Currency);
我个人认为ZeroMemory
比FillChar
更具描述性。
答案 1 :(得分:2)
它仍然出现在Delphi XE4中 报告编号:118866状态:报告
无法对货币变量执行FillChar https://web.archive.org/web/20150322021442/http://qc.embarcadero.com/wc/qcmain.aspx?d=118866
它类似于 http://qc.embarcadero.com/wc/qcmain.aspx?d=87168(未归档)
Delphi的编译器错误的解决方法< 2009:使用Windows单元中的ZeroMemory或FillMemory,其功能与FillChar一样。
在Delphi方面,ZeroMemory
和FillMemory
使用FillChar
下面的inlined,自Delphi 2006起。{
在C ++方面,都使用编译器宏。
这个问题可能只发生在Currency
上,因为这是唯一一个缩放的数字编译器类型。
该问题不会使用序数类型,常规浮点类型和Comp
重现。
修改:问题已在XE5 Update 2
中修复