标签: fillchar

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

以下代码应该编译并使用许多其他类型进行编译.
但是,编译器报告"Constant对象不能作为var参数传递"错误 - 尽管变量显然是一个变量.

program CurrencyConstant;
{$APPTYPE CONSOLE}
var
  GVar: Currency;
begin
  FillChar(GVar, SizeOf(GVar), 0);
end.
Run Code Online (Sandbox Code Playgroud)

同样,过程中的局部变量也会出现同样的问题.

procedure TestCurrency;
var
  LVar: Currency;
begin
  FillChar(LVar, SizeOf(LVar), 0);
end;
Run Code Online (Sandbox Code Playgroud)

我怀疑它与FillChar编译器魔术程序有关,这Dest是一个无类型的var参数. FillChar是我发现这个问题的唯一例程.

  • 是什么导致这个问题?
  • 是否有其他类型受到影响?

为了回应不可避免的"为什么要做那个评论":我们有一个代码生成器,它使用FillChar来一般地初始化记录结构和原始类型.它适用于其他一切,但出乎意料地失败了货币.我们确实有解决方法,但了解根本原因会很好,并且知道是否还有其他因素可能会给我们带来麻烦.


编辑

根据Jeroen的回答,可以合理地得出结论,这个问题存在于Delphi的所有部分中.此外,货币阵列显然也出现了类似的问题.

大卫的回答提供了一些很好的解决方法.

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

delphi compiler-construction delphi-2007 delphi-5 fillchar

12
推荐指数
2
解决办法
322
查看次数