2017-09-14 71 views
-1

我有一個奇怪的問題,我無法修復。我從微控制器通過TCP發送3個浮點值。在我的PC上,我只是想打印這些值。當我在釋放模式下運行代碼時,它只打印小數點前面的數字。但是當我調試程序時,一切正常。爲什麼程序打印在調試和發佈時浮動不同?

這是代碼:

char laserL_Buffer[32]; 
char laserR_Buffer[32]; 
char laserM_Buffer[32]; 

TCPConnector* connector = new TCPConnector(); 
TCPStream* stream = connector->connect("10.42.0.2",3333); 

//Send l for laserData 
char cT = 'l'; 
stream->send(&cT,1); 

//Receive the Data for Left Right and Middle Range from laserScanner 
stream->receive(laserL_Buffer,32); 
stream->receive(laserR_Buffer,32); 
stream->receive(laserM_Buffer,32); 

delete stream; 

float l = strtof(laserL_Buffer,nullptr); 
float m = strtof(laserM_Buffer,nullptr); 
float r = strtof(laserR_Buffer,nullptr); 

std::cout << std::fixed << std::setprecision(8) << l << std::endl; 
std::cout << std::fixed << std::setprecision(8) << m << std::endl; 
std::cout << std::fixed << std::setprecision(8) << r << std::endl; 

所有的答案好感謝,我只是想出了這個問題。我將strtof改爲boost :: lexical_cast。然後它運行良好。

+1

不確定是否相關,但:您確定要'刪除流',還是應該刪除連接符? –

+0

offtopic:'//發送p位置char cT ='l';'這是我不喜歡評論的主要原因。 – user463035818

+0

在發佈和調試過程中'laserX_Buffer'的內容是否相同? – piwi

回答

1

發佈模式可能有不同的FP策略集。根據您希望的優化級別,有不同的浮點運算模式。例如,MSVC具有嚴格,快速和精確的模式。

+0

好的,我可以在哪裏更改模式,或檢查我選擇的模式? 感謝您的回答。 –

+0

看一看https://msdn.microsoft.com/en-us/library/e7s85ffb.aspx?ppud=4 –

+0

我插入了 #pragma float_control(精確,在,推) //使用/ fp的代碼:精確模式 #pragma float_control(pop) 但它沒有改變行爲。 –

0

從你的代碼我猜你發送每個浮點數只有32個字符,你的緩衝區長度爲32,所以它們不是零端。使它們長33字節並將最後一個設置爲零,因此strtof將知道何時結束解析並查看它是否有效。我希望我能告訴你爲什麼它在調試中的功能與在發佈版中不同,但基本上在調試中你有一些障礙,並且編譯器可能會將你的本地變量放置到歸零內存空間中。在發行版中,它們很可能與優化對齊。

char laserL_Buffer[33]; 
char laserR_Buffer[33]; 
char laserM_Buffer[33]; 

TCPConnector* connector = new TCPConnector(); 
TCPStream* stream = connector->connect("10.42.0.2",3333); 

//Send l for laserData 
char cT = 'l'; 
stream->send(&cT,1); 

//Receive the Data for Left Right and Middle Range from laserScanner 
stream->receive(laserL_Buffer,32); 
stream->receive(laserR_Buffer,32); 
stream->receive(laserM_Buffer,32); 

laserL_Buffer[32] = laserR_Buffer[32] = laserM_Buffer[32] = 0; 
delete stream; 

float l = strtof(laserL_Buffer,nullptr); 
float m = strtof(laserM_Buffer,nullptr); 
float r = strtof(laserR_Buffer,nullptr); 

std::cout << std::fixed << std::setprecision(8) << l << std::endl; 
std::cout << std::fixed << std::setprecision(8) << m << std::endl; 
std::cout << std::fixed << std::setprecision(8) << r << std::endl; 
+0

感謝您的回答,我試過了,但沒有解決我的問題。 我想我在我的問題上犯了一個小錯誤。問題不在調試和發佈之間。當我設置斷點時,我得到正確的值,如果我正常運行程序,則行爲如上所述。 –

+0

好吧,那麼如果你縮小你的代碼來打印?試着找出最小的例子。如果你的問題出現在顯示它們的方法上,那麼浮點值是否相關?嘗試從rand()給出相同的值(因此它不會被編譯器內聯)並查看它是否重複 – R2RT

+0

@OliverS。上面的評論,忘記標記你 – R2RT

0

我改變它到下面,然後它的工作。

char laserL_Buffer[8]; 
char laserR_Buffer[8]; 
char laserM_Buffer[8]; 
LaserData l_data; 

TCPConnector* connector = new TCPConnector(); 
TCPStream* stream = connector->connect("10.42.0.2",3333); 

//Send p for position 
char cT = 'l'; 
stream->send(&cT,1); 

//Receive the Data for Left Right and Middle Range from laserScanner 
stream->receive(laserL_Buffer,8); 
stream->receive(laserR_Buffer,8); 
stream->receive(laserM_Buffer,8); 

delete stream; 
delete connector; 

l_data.laserLeftRange = boost::lexical_cast<float>(laserL_Buffer); 
l_data.laserRightRange = boost::lexical_cast<float>(laserR_Buffer); 
l_data.laserMidRange = boost::lexical_cast<float>(laserM_Buffer); 
+0

不錯,你得到它的工作,但它提出了另一個問題:它爲什麼現在工作? ;)爲什麼它沒有提前。另外,我仍然認爲你應該零終止你的char緩衝區。 – R2RT

+0

是的,我應該這樣做。我不知道它爲什麼起作用。我認爲有關記憶的事情出錯了。或者是什麼導致了未定義的行爲 –

相關問題