gpt4 book ai didi

delphi - 为什么 Delphi 中的 FillChar 将货币变量视为常量?

转载 作者:行者123 更新时间:2023-12-03 14:39:02 24 4
gpt4 key购买 nike

以下代码应该可以编译并且确实可以与许多其他类型一起编译。
但是,编译器报告“常量对象无法作为 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 是我发现的解决此问题的唯一例程。

  • 是什么原因导致此问题?
  • 是否有其他类型受到影响?

In response to the inevitable "Why would you do that comments": We have a code generator that uses FillChar to generically initialise record structures & primitive types. It works with everything else, but unexpectedly failed with Currency. We do have workarounds, but it would be nice to understand the root cause, and know whether anything else is likely to cause us trouble.

<小时/>

编辑

来自Jeroen's answer可以合理地得出结论,该问题存在于 Delphi 的所有版本中。此外,货币数组显然也存在类似的问题。

David's answer提供了一些不错的解决方法。

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

最佳答案

What causes the problem?

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

Are any other types affected?

也许吧。尝试一些来找出答案。

<小时/>

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

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

或者也许像这样:

ZeroMemory(@LVar, SizeOf(LVar));

或者甚至像这样:

LVar := Default(Currency);

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

关于delphi - 为什么 Delphi 中的 FillChar 将货币变量视为常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18717991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com