2 つの Real48 (6 バイト float) を比較する次のコードは、コンパイルして実行しますが、無意味な結果を生成するか、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 があればそれを参照したいと思います。
REAL48
最後に....を使用して2つのタイプを比較するにはどうすればよいTComparer<something>
ですか?
編集:
これは私が解決した修正でした:
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;