加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 03:33:40 所属栏目:大数据 来源:网络整理
导读:以下代码应该编译,并且可以使用许多其他类型进行编译. 但是,编译器报告“常量对象不能作为var参数传递”错误 – 尽管变量显然是一个变量. program CurrencyConstant;{$APPTYPE CONSOLE}var GVar: Currency;begin FillChar(GVar,SizeOf(GVar),0);end. 类似地,
以下代码应该编译,并且可以使用许多其他类型进行编译.
但是,编译器报告“常量对象不能作为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年:使用ZeroMemory或FillMemory从Windows单元,工作原理和FillChar.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读