【问题标题】:In Delphi, and why are not directly comparable threadvar types of floating point?在Delphi中,为什么不能和threadvar直接比较浮点类型?
【发布时间】:2012-05-11 23:42:53
【问题描述】:

我在 Delphi 6,7 和 XE2 中测试过,都显示这个错误。
我想直接比较线程中的两个浮点数,像这样:

threadvar
  a,b : Double;

procedure test;
begin
  if a > b  then
    ;
end;

但是在编译的时候,DCC发生了内部错误,所以我改成了这样:

threadvar
  a,b : Double;

procedure test;
begin
  if a - b > 0  then
    ;
end;

错误消失了,为什么?

【问题讨论】:

  • Delphi 编译器中的“内部错误”通常不应该发生。换句话说,这很可能是 Embarcadero 的某个人需要解决的错误,而不是 StackOverflow 上的某个人可以“回答”的编程问题。
  • 所以如果我直接复制您的第一个代码块并将其按原样放入一个单元中,我会收到内部错误吗?可能是因为在 procedure test 中使用 a 或 b 之前您没有初始化它们吗?
  • 你没有提到你使用的Delphi版本;但是我能够在 Delphi 2010 中重现这一点。我收到的确切错误是:[DCC 致命错误] Unit1.pas(36): F2084 Internal Error: URW2306
  • 我用Delphi 6、7和XE2编译这段代码,都有内部错误。

标签: multithreading delphi floating-point double


【解决方案1】:

这显然是编译器中的一个错误。我已将该错误报告给 Quality Central,QC#101656。该错误仅影响 32 位编译器,这对任何人都没有太大的安慰!

您可以通过将变量放在这样的记录中来解决它:

threadvar
  r: record
    a,b: Double;
  end;

procedure test;
begin
  if r.a > r.b then
    ;
end;

【讨论】:

  • 另一种解决方法(不一定更好)似乎是间接引用值:if PDouble(@a)^ > PDouble(@b)^ then
  • 我猜使用 Math 单元中的 CompareValue 例程也可以解决这个问题......而且它通常是比较浮点值的首选方法。
  • @Ken CompareValue 也回避了内部错误,但我不同意它优于不等式运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2017-01-04
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多