【发布时间】:2016-05-30 09:21:57
【问题描述】:
我正在尝试使用 C++ 中的 H5Cpp 库读取具有复合数据类型的 HDF5 数据集。 HDF5 文件是由模拟器创建的,所以很遗憾我无法控制结构。每个单元格包含多组可变长度浮点数和一组可变长度整数。 h5dump显示的头结构为:
DATASET "SET_NAME" {
DATATYPE H5T_COMPOUND {
H5T_VLEN { H5T_IEEE_F64LE} "dProp1";
H5T_VLEN { H5T_IEEE_F64LE} "dProp2";
H5T_VLEN { H5T_STD_I32LE} "iProp1";
H5T_VLEN { H5T_IEEE_F64LE} "dProp3";
}
DATASPACE SIMPLE { ( 5, 122 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
}
我试图创建一个包含VarLenTypes 的CompType,但是在运行时会抛出异常,指出一个成员与另一个成员重叠(当任何地方给出的唯一大小是包含指针的结构的大小)。这是我到目前为止的摘录:
#include <H5Cpp.h>
typedef struct mytype_t {
double* dprop1;
double* dprop2;
int* iprop1;
double* dprop3;
} mytype_t;
H5::CompType ctype(sizeof(mytype_t));
auto double_type = H5::PredType::NATIVE_DOUBLE;
auto int_type = H5::PredType::NATIVE_INT;
auto vdouble_type = H5::VarLenType(&double_type);
auto vint_type = H5::VarLenType(&int_type);
ctype.insertMember("dProp1", HOFFSET(mytype_t, dprop1), vdouble_type);
ctype.insertMember("dProp2", HOFFSET(mytype_t, dprop2), vdouble_type);
ctype.insertMember("vProp1", HOFFSET(mytype_t, iprop1), vint_type);
ctype.insertMember("dProp3", HOFFSET(mytype_t, dprop3), vdouble_type);
std::vector<mytype_t> data_vector;
data_vector.resize(dims[0]*dims[1]);
dataset.read(data_vector.data(), ctype);
如何读取这样的数据集?
【问题讨论】: