2011-12-08 25 views
4

我已經在Delphi 6,7和XE2中測試過了,都顯示這個錯誤。
我想在線程直接比較兩個浮點數,就像這樣:在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

在Delphi編譯的「內部錯誤」一般是不是應該發生的。換句話說,這很可能是一個來自Embarcadero的人需要解決的問題,而不是StackOverflow上的某個人可以「回答」的編程問題。 –

+2

所以,如果我直接複製你的第一塊代碼,並把它作爲一個單位,我得到一個內部錯誤?難道是因爲你在'程序測試'中使用之前沒有初始化a或b? –

+1

你沒有提到你正在使用的Delphi版本;但是我能夠在Delphi 2010中重現這一點。我收到的確切錯誤是這樣的:[DCC致命錯誤] Unit1.pas(36):F2084內部錯誤:URW2306 – vcldeveloper

回答

3

這顯然是編譯器中的一個錯誤。我向Quality Central報告了這個錯誤,QC#101656。這個bug隻影響32位編譯器,並不會讓任何人感到安慰!

你可以解決它把你的變量記錄是這樣的:

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

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

另一個解決方法(不一定更好)似乎是間接引用的值:'如果PDouble(@a)^> PDouble(@b)^ then' –

+0

我猜想使用Math單元中的CompareValue例程將修復問題太...而且它通常是比較float值開始的首選方法。 –

+0

@Ken CompareValue也迴避了內部錯誤,但我不同意它是不偏不倚的操作符。 –