【发布时间】:2015-06-10 11:07:12
【问题描述】:
以下用于比较两个 Real48(6 字节浮点数)的代码编译并运行,但要么生成无意义的结果,要么生成 AV。
program Project44;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
System.Generics.Defaults;
begin
try
WriteLn(System.Generics.Defaults.TComparer<Real48>.Default.Compare(100.0,100.0));
WriteLn('all ok, press space');
except on E:exception do
WriteLn(e.Message);
end;
ReadLn
end.
它应该输出 0,但如果它没有先炸弹,它会输出 -92 或其他一些不正确的值。
这个错误仍然存在于最新的 XE8 中吗?
如果是这样,之前有没有报道过,我在https://quality.embarcadero.com 上找不到任何东西,但是如果有一个较旧的 QC,我想参考一下。
终于……
如何使用TComparer<something> 比较两个REAL48 类型?
编辑:
这是我决定的解决方法:
interface
...snip...
[Test]
procedure TestReal48;
...snip...
TTest<T> = record
private
class var Def: System.Generics.Defaults.IComparer<T>;
class var F: FastDefaults.TComparison<T>;
public
class function Real48Comparison(const Left, Right: T): Integer; static;
implementation
procedure TestDefault.TestReal48;
var
OldDef: System.Generics.Defaults.IComparer<Real48>;
begin
OldDef:= TTest<Real48>.Def;
TTest<Real48>.Def:= System.Generics.Defaults.TComparer<Real48>.Construct(TTest<Real48>.Real48Comparison);
TTest<Real48>.Test(100.0,100.0);
TTest<Real48>.Test(100000.0,-10000.0);
TTest<Real48>.Test(0.0,-10000.0);
TTest<Real48>.Test(100000.0,0.0);
TTest<Real48>.Test(0.0,0.0);
TTest<Real48>.Def:= OldDef;
end;
【问题讨论】:
标签: delphi delphi-xe7 delphi-xe8