C++ 使用HDF5 C+编写动态大小的复合类型数据集+;

C++ 使用HDF5 C+编写动态大小的复合类型数据集+;,c++,visual-c++,struct,dynamic-arrays,hdf5,C++,Visual C++,Struct,Dynamic Arrays,Hdf5,我试图将动态分配的结构写入HDF5复合数据集中,类似于。我已经发布了我的代码中的相关片段,该代码编译并被其他工作的H5代码包围,这些代码编写其他数据结构时没有问题(标量、数组、属性)。另外,我不是C++专业的,所以如果有什么不合适的地方,请告诉我。 首先,我有一个动态分配的op数组,其长度nop在运行时确定: #include "H5Cpp.h" int main () { unsigned int nop = 0; typedef struct op_t {

我试图将动态分配的结构写入HDF5复合数据集中,类似于。我已经发布了我的代码中的相关片段,该代码编译并被其他工作的H5代码包围,这些代码编写其他数据结构时没有问题(标量、数组、属性)。另外,我不是C++专业的,所以如果有什么不合适的地方,请告诉我。 首先,我有一个动态分配的
op
数组,其长度
nop
在运行时确定:

#include "H5Cpp.h"

int main ()
{
    unsigned int nop = 0;
    typedef struct op_t {
        int id;
        double x;
        double y;
        double z;
    } op_t;
    /* there's a for-loop that determines value of nop, e.g. 1 */
    nop = 1;
    op_t *op = new op_t[nop];
    // populate with example data
    for (int n = 0; n < nop; n++)
    {
        op[n].id = n + 1;
        op[n].x = 10.0 * n + 10.0;
        op[n].y = 200.0 * n + 20.0;
        op[n].z = 30.0 * n + 30.0;
    }
我的结果表不是我所期望的,因为(1):数据值错误,(2)标题名称不正确。例如,使用
nop==1
,我看到:

È
是如何进入标题名称的?标头名称似乎每隔一段时间就会更改为其他垃圾字符,代码也会有轻微更改。此外,数据结构未复制或写入HDF5数据集

我使用微软Visual C++ 2010 Express,用预编译的HDF5.1.811共享库,这个项目一直在工作,除了创建/写入<代码> H5::COMPYTHOR> < /C> >


<强>更新1 <强>此简短示例在Debian上使用“代码> H5C++< /COD>”,令人讨厌,因此它可能与MS VisualC++(

)有关。
更新2该问题仅发生在调试生成目标上,并且仅适用于
H5::CompType
。发布版本目标“消失”了,我觉得这很奇怪,也很烦人。

我今天一直在努力解决这个问题。查看CompData.insertMember的代码没有帮助。它实际上只是H5Tinsert的一个很薄的包装,但是我怀疑关于H5std_字符串(它是std::string的typedef'd)有一些可疑的行为

以下操作无效,并返回一个错误,即我的一个成员名称不唯一:

typedef struct {
  uint32_t data1;
  uint32_t test;
} simple_s;
CompType mydata(sizeof(simple_s));
mydata.insertMember(name1, HOFFSET(simple_s, data1), PredType::NATIVE_UINT32);
mydata.insertMember(name2, HOFFSET(simple_s, test), PredType::NATIVE_UINT32);
但是,如果我改用

H5Tinsert(mydata.getId(), "data1", HOFFSET(simple_s, data1), H5T_NATIVE_UINT32);
H5Tinsert(mydata.getId(), "test", HOFFSET(simple_s, test), H5T_NATIVE_UINT32);
它不是insertMember,而是按预期工作。或者这也行

const H5std_string name1("data1");
const H5std_string name2("test");
mydata.insertMember(name1, HOFFSET(simple_s, data1), PredType::NATIVE_UINT32);
mydata.insertMember(name2, HOFFSET(simple_s, test), PredType::NATIVE_UINT32);

所以,似乎只有当您通过原始CString进行转换时才会出现这种情况。非常令人沮丧的是,即使是通过static_cast(“data1”)进行的static_cast也不起作用。我在VS2013 32位上以调试模式编译,我自己使用相同的编译器编译HDF5。对于STD::字符串,有调试标志集被关闭,但这是我唯一的解释,但是我不理解它是如何干扰的。

在阅读这个帖子之前我没有注意,但是我们也直接使用H5TStUnter(),即使我们通常使用C++ H5:API,所以它可能是同一个问题。
const H5std_string name1("data1");
const H5std_string name2("test");
mydata.insertMember(name1, HOFFSET(simple_s, data1), PredType::NATIVE_UINT32);
mydata.insertMember(name2, HOFFSET(simple_s, test), PredType::NATIVE_UINT32);