【问题标题】:Data Type Conversion of Delphi var ParameterDelphi var参数的数据类型转换
【发布时间】:2017-03-27 16:53:40
【问题描述】:

我有一个带有var Extended 参数的函数。如果我在调用函数时尝试使用 Double 类型参数,编译器会报错。但是,如果我将 Extended 值作为函数 Result 传回(并分配给 Double 变量),那么编译器会很高兴。

这是预期的吗?如果是这样,有什么方法可以欺骗编译器降低参数的精度以匹配参数?

function foo1(var e: extended): boolean;
begin
  e := 0.0;
  Result := true;
end;

function foo2(): extended;
begin
  Result := 0.0;
end;

procedure CallFoo();
var
  d: double;
begin
  if foo1(d) then Exit; // compiler complains
  d := foo2; // compiler happy
end;

【问题讨论】:

    标签: delphi


    【解决方案1】:

    var 参数要求实际参数完全匹配。您只能传递 Extended 变量。

    您的一个选择是为您需要的每种浮点类型引入重载。但我的建议是停止使用Extended 并改用DoubleExtended 类型仅存在于 32 个 Intel 平台上,并且很少提供优于 Double 的任何好处。相反,它不寻常的 10 字节大小通常会由于未对齐和缓存使用效率低下而导致性能不佳。

    【讨论】:

    • @FreeConsulting:我不太明白。您在说什么“答案的填充部分”?
    • @Rudy 对于它在 st(0) 中返回的返回值,所以这并不重要。在其他情况下,最好用纯双版本隐藏 RTL 函数。但更重要的是不要使用 Extended 作为变量的数据类型。
    • @Free 你显然不知道你在说什么,也不了解对齐和缓存浪费等问题。你是浮点专家吗?还是你只是喜欢搅拌?
    • 我正在回复您的评论,即建议很差。我不相信你知道你在说什么,我不相信你明白对齐和高效缓存使用的重要性。
    • @Free - 您链接引用的文档:“如果例程的声明指定了 var 参数,则必须传递可分配的表达式”。显然,double 是与扩展兼容的赋值。该页面上是否有任何内容可以解释问题中的行为?
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 2015-08-21
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多