【发布时间】:2013-09-10 11:39:27
【问题描述】:
以下代码应该可以编译,并且可以与许多其他类型一起编译。
但是,编译器报告“常量对象不能作为 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 是我发现这个问题的唯一例程。
- 是什么导致了这个问题?
- 是否有其他类型受到影响?
为了回应不可避免的“你为什么要这样做 cmets”:我们有一个代码生成器,它使用 FillChar 来一般地初始化记录结构和原始类型。它适用于其他一切,但意外地与货币失败。我们确实有解决方法,但最好了解根本原因,并了解是否有其他任何事情可能给我们带来麻烦。
编辑
从Jeroen's answer 可以合理地得出结论,该问题存在于所有版本的 Delphi 中。此外,Currency 数组显然也存在类似问题。
David's answer 提供了一些不错的解决方法。
最后一个要考虑的解决方法是,修改生成器以将货币作为特殊情况处理,并简单地设置 Value := 0。
【问题讨论】:
-
它仍然出现在 Delphi XE4 中。报告编号:118866 状态:报告无法对货币变量 qc.embarcadero.com/wc/qcmain.aspx?d=118866 执行 FillChar 它类似于 qc.embarcadero.com/wc/qcmain.aspx?d=87168 Delphi Windows 单元中的
ZeroMemory与FillChar一样有效。 -
@Jeroen猜猜ZeroMemory是如何实现的?
-
@JeroenWiertPluimers 谢谢。您可以重新发布作为答案吗?这些链接比单纯的评论更值得关注。
-
@CraigYoung 该报告现在被标记为已修复。我想知道该修复程序将在哪个版本的 Delphi 中发布。
-
@CraigYoung 它已在 Delphi XE5 Update 2 中得到修复;寻找118866:edn.embarcadero.com/article/43522
标签: delphi compiler-construction delphi-2007 delphi-5 fillchar