2015-02-17 23 views
0

我正在一個項目中,我必須在託管代碼和非託管代碼之間進行接口。我目前在math.h中遇到了一個奇怪的問題。math.h函數返回無效結果與C++/clr

一些功能將浮點數將返回0(例如:2.1219957934356005e-314)和隨機...

例如:

int error = 0; 
int success = 0; 
for (int i = 0; i < 1000; ++i) 
{ 
    double test = std::sqrt(9.01); 
    if (test < 2 || test > 4) 
    { 
     ++error; 
    } 
    else 
    { 
     ++success; 
    } 
} 

一般我會得到錯誤= 1000與斷點,我我會重試一次,再次得到1000錯誤和有些時候我會得到1000成功...

我看到沒有任何錯誤的反彙編和進入寄存器(壞結果除外)。

對於上下文:該代碼被編譯爲64位的dll,並被C#使用。這個應用程序確實是多線程的。

有什麼想法?

+0

您提供應該不會產生這樣的錯誤代碼。如果你有線程代碼,你將不得不顯示相關部分。在沒有看到代碼的情況下,很難說出什麼會導致這樣的錯誤。 – CoryKramer 2015-02-17 22:33:03

+0

在測試更改時是否鎖定線程?/已初始化 – 2015-02-17 22:34:12

+0

我有很多線程,這個線程已經在兩個不同的線程上測試過,結果相同(我沒有任何相關的代碼可以顯示)。我不認爲我需要鎖定,因爲在這個測試中所有的變量都是本地的,沒有共享內存。除非math.h使用一些靜態和全局變量? – Nic007 2015-02-17 22:37:29

回答

1

我想我解決了我的問題的一部分(我必須做更多的測試)。

主要問題是由於我的項目更改爲clr(託管代碼)。隨着更多的研究,我發現我可以編譯我的項目的特定文件,將屬性clr設置爲no。現在我所有的原生源代碼都被編譯爲本地代碼。但它仍然無法解釋爲什麼像sqrt(),ceil()等函數在託管上下文中每次都不起作用。現在

我必須解決使用OpenGL的錯誤,但這是另一個故事:d(該項目是一個可憎!)