为什么程序打印在调试和发布中浮动不同
Why is the program printing float different in debug and release?
我有一个奇怪的问题,我无法解决。我从微控制器上通过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。然后工作正常。
发布模式可能具有不同的FP策略集。根据您想要的优化水平,有不同的浮点算术模式。例如,MSVC具有严格,快速和精确的模式。
从您的代码中,我猜您为每个浮子发送了32个字符,并且您的缓冲区具有Lenght 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;
我将其更改为以下内容,然后使用。
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);
相关文章:
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 如何在使用 SDL2 的 Eclipse 中构建 c++ 程序
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- txt 文件中浮点数的最大和最小值
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 如何打印源文件中与 GDB 中的程序流关联的所有行号
- 如何在添加文件的情况下在VSCode中调试C++程序
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 在虚幻引擎C++中浮点时出现TArray错误
- 如何从 CLion 的运行窗口中删除程序项目路径
- 在C++中的程序之间共享指针
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- 解析 C# 中的C++程序集
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 在OpenGL中使用程序集代码渲染视频时出错
- 我无法在代码块中编译c ++程序。它给了我错误
- PyFunctionObject 在 Py_Finalize 中使程序崩溃,如果它在 PyTuple 中被设置了项目
- C++ 中的程序集内联(浮点型和_cdecl型)
- C++程序中浮点溢出的诊断