为什么程序打印在调试和发布时浮动不同?

时间:2017-09-14 08:19:57

标签: c++ tcp

我有一个奇怪的问题,我无法解决。我通过TCP从微控制器发送3个浮点值。在我的电脑上,我只想打印这些值。当我在发布模式下运行代码时,它只打印小数点前面的数字。但是当我调试程序时,一切正常。

这是代码:

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。然后它工作正常。

3 个答案:

答案 0 :(得分:1)

发布模式可能具有不同的FP策略集。根据您所希望的优化级别,有不同的浮点运算模式。例如,MSVC具有严格,快速和精确的模式。

答案 1 :(得分: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;

答案 2 :(得分: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);
相关问题