2011-12-08 9 views
4

これをDelphi 6,7およびXE2でテストしましたが、すべてこのエラーが表示されます。
私はこのように、直接のスレッドで2つの浮動小数点数を比較したいと思います:Delphiでは、なぜ、直接比較可能なthreadvarタイプの浮動小数点はありませんか?

threadvar 
    a,b : Double; 

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

が、コンパイルするときに、DCCは、私はこのようにそれを変え内部error.So発生しました:

threadvar 
    a,b : Double; 

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

エラーが消えた理由は何ですか?

+5

「内部エラー」は、一般的に起こるべきものではありません。言い換えれば、これはおそらく、StackOverflowの誰かが「答える」プログラミングの質問ではなく、Embarcaderoの誰かが対処する必要のあるバグです。 –

+2

最初のコードブロックを直接コピーしてそのままユニットに入れると、内部エラーが出ますか?あなたが 'プロシージャテスト 'で使用される前にaまたはbを初期化していないためかもしれませんか? –

+1

使用しているDelphiのバージョンについては言及していません。 [DCC致命的なエラー] Unit1.pas(36):F2084内部エラー:URW2306 – vcldeveloper

答えて

3

これは明らかにコンパイラのバグです。私はこのバグをQuality Central QC#101656に報告しました。このバグは32ビットコンパイラにのみ影響しますが、それは誰にも大きな慰めになるでしょう!あなたはこのようなレコードであなたの変数を置くことによって、それを回避することができます

:Delphiコンパイラで

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

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

もう1つの回避策(必ずしも良いとは限りません)は、間接的に値を参照するように思われます: 'If PDouble(@a)^> PDouble(@b)^ then' –

+0

MathユニットのCompareValueルーチンを使用して推測すると、また、浮動小数点の値を比較するための方法としては、通常は最初に使用する方法です。 –

+0

@Ken CompareValueは内部エラーを回避しますが、不等式演算子より優先されることに同意しません。 –

関連する問題