为什么一个Currency变量在Delphi中用FillChar处理为常量?

前端之家收集整理的这篇文章主要介绍了为什么一个Currency变量在Delphi中用FillChar处理为常量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下代码应该编译,并且可以使用许多其他类型进行编译.
但是,编译器报告“常量对象不能作为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年可以合理地得出结论,这个问题存在于德尔福的所有地方.此外,货币阵列显然也出现了类似的问题.

David’s answer提供了一些不错的解决方法.

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

解决方法

正如 requested Craig Young

It still occurs in Delphi XE4.
Report No: 118866 Status: Reported
Cannot perform FillChar on Currency variables
07002
It is similar to
07003

Delphi的编译器错误解决方法2009年:使用ZeroMemoryFillMemory从Windows单元,工作原理和FillChar.

在Delphi方面,ZeroMemory和FillMemory使用下面的FillChar,其中可能是Delphi 2006的inlined.
在C方面都使用编译器宏.

可能这个问题只发生在货币,因为这是唯一的数字编译器类型被缩放.
该问题不会以序数类型,常规浮点类型和Comp复制.

编辑:问题已在XE5 Update 2修复

原文链接:https://www.f2er.com/delphi/102551.html

猜你在找的Delphi相关文章