c++ - 在使用 std::stod 之前初始化 QApplication 的奇怪错误

标签 c++ qt c++11 stl dcmtk

我在当前项目中收到意外行为。

我使用 DICOM 库 dcmtk 从一些 dicom 文件中读取信息,并使用 Qt 来显示图像。

在信息提取过程中,我必须转换格式为“<64bit float>\<64 bit float>”(Dicom Tag PixelSpacing)的字段。我在“\”处分成 2 个字符串,并将字符串转换为 double 字符串。到目前为止,一切正常。

好吧,差不多:每当我之前创建一个QApplication对象时,我将字符串转换为 double ,它给我整数而不是 double

代码如下所示:

// Faulty situation
Database db;

QApplication app(&argc, argv);
db.fill_from_source(source); // here i get ints instead of doubles

// Rearrange code and recompile:
Database db;
db.fill_from_source(source); // now it gets me doubles.

QApplication app(&argc, argv);

// The fill function looks like this (simplified)
void Database::fill_from_source(const Source& source){

    string s = source.get_pixel_spacing_string();
    vector<string> s2 = split(s, "\\");

    // get the double, that should not be integers!
    double a = stod(s2[0]);
    double b = stod(s2[1]);
}

更让我困惑的是,它确实可以使用 QtCreator 和 GDB 单步执行代码。但是,当我运行可执行文件时,我再次获得整数。

所以我将问题追溯到 stod 操作:我从 DICOM 文件中得到了正确的字符串,但是在 stod 之后,点后面的数字被截断了.与 stdlibstrtod

行为相同

QApplication 分配是否对 std::stod 函数起作用?由于一切都是在运行时发生的,所以我不明白是如何发生的。

QString::toDouble 替换 stod 解决了这个问题...

我正在使用 gcc 版本 4.8.4(Ubuntu 4.8.4-2ubuntu1~14.04.3),GNU ld(Ubuntu 的 GNU Binutils)2.24

其他代码依赖包括Eigen3Boost.Python。代码是使用以 QtCreator 作为 IDE 的 CMake 项目构建的。

有人知道这个问题是从哪里来的吗?这是一个 Qt 错误吗?

最佳答案

作为 DCMTK 开发人员之一,即您使用的 DICOM 工具包,我想知道为什么您不直接从 DICOM 数据元素“像素间距”中检索浮点值,我的意思是而不是检索整个字符串 (包括反斜杠分隔符),然后将其组件转换为单独的 float 。这样,当前的语言环境设置就完全没有问题。

顺便说一句,由于区域设置问题,我们引入了我们自己的独立于区域设置的 OFStandard::atof()辅助函数:-)

关于c++ - 在使用 std::stod 之前初始化 QApplication 的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41269345/

相关文章:

C++动态向下转换为具有模板模板参数的类模板是类模板或别名模板

javascript - QWebElement评估JavaScript this.click()方法不起作用

qt - QML 自定义按钮无法发出按下信号,因为它不是一个函数?

c++ - 让一个对象包含另一个相同类型的对象?

c++ - 调用静态方法,出现错误 : LNK2019

c++ - QWidget setFocus 什么都不做

c++ - 为什么wxWidgets在调用new之后从不调用delete?

c++ - 集的静态constexpr

python - 停止嵌入式 python

c++ - 如何继承boost.process中的某些fd,同时关闭所有其他fd