2017-09-14 42 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

是的,我应该这样做。我不知道它为什么起作用。我认为有关记忆的事情出错了。或者是什么导致了未定义的行为 –

相关问题