为什么在Delphi中使用FillChar将Currency变量视为常量?

时间:2013-09-10 11:39:28

标签: delphi compiler-construction delphi-2007 delphi-5 fillchar

以下代码应该编译并使用许多其他类型进行编译 但是,编译器报告“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

2 个答案:

答案 0 :(得分:8)

  

导致问题的原因是什么?

编译器错误。请提交质量控制报告。

  

是否有其他类型受到影响?

也许。试着找一些。


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

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

或者可能是这样的:

ZeroMemory(@LVar, SizeOf(LVar));

甚至是这样:

LVar := Default(Currency);

我个人认为ZeroMemoryFillChar更具描述性。

答案 1 :(得分:2)

requested作为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方面,ZeroMemoryFillMemory使用FillChar下面的inlined,自Delphi 2006起。{
在C ++方面,都使用编译器宏。

这个问题可能只发生在Currency上,因为这是唯一一个缩放的数字编译器类型。
该问题不会使用序数类型,常规浮点类型和Comp重现。


修改:问题已在XE5 Update 2

中修复