12

以下代码应该可以编译,并且可以与许多其他类型一起编译。
但是,编译器报告“常量对象不能作为 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 的回答可以合理地得出结论,该问题存在于所有版本的 Delphi 中。此外,货币数组显然表现出类似的问题。

大卫的回答提供了一些不错的解决方法。

最后一个要考虑的解决方法是,修改生成器以将货币作为特殊情况处理,并简单地设置Value := 0.

4

2 回答 2

8

是什么导致了问题?

一个编译器错误。请提交质控报告。

其他类型是否受到影响?

也许。尝试一些以找出答案。


至于解决方法,我会这样写:

FillChar(Pointer(@LVar)^, SizeOf(LVar), 0);

或者可能像这样:

ZeroMemory(@LVar, SizeOf(LVar));

甚至像这样:

LVar := Default(Currency);

我个人认为ZeroMemoryFillChar.

于 2013-09-10T11:59:23.133 回答
2

根据Craig Young要求

它仍然出现在 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 单元中的ZeroMemoryFillMemory ,其工作方式与FillChar 一样

在 Delphi 方面,ZeroMemory使用FillMemoryDelphi 2006FillChar可能内联
的下面。 在 C++ 方面,两者都使用编译器宏。

可能只发生此问题,Currency因为这是唯一可缩放的数字编译器类型。
序数类型、常规浮点类型和Comp.


编辑:该问题已在XE5 更新 2中修复

于 2013-09-11T09:54:07.780 回答