我正在尝试向HDF5写一个包含指向另一个指针的结构。像这样:
typedef struct{
int32_t method;
void* methodParams;
float result;
}Measure;
typedef struct{
int32_t param1;
int32_t param2;
}OneMethod;
以下用于描述复合数据类型的代码不起作用:
Measure value;
hid_t method_tid;
hid_t measure_tid;
method_tid = H5Tcreate(H5T_COMPOUND, sizeof(OneMethod));
H5Tinsert(method_tid, "P1", HOFFSET(OneMethod, param1), H5T_NATIVE_INT32);
H5Tinsert(method_tid, "P2", HOFFSET(OneMethod, param2), H5T_NATIVE_INT32);
measure_tid = H5Tcreate(H5T_COMPOUND, sizeof(Measure));
H5Tinsert(measure_tid, "Method", HOFFSET(Measure, method), H5T_NATIVE_INT32);
H5Tinsert(measure_tid, "Params", HOFFSET(Measure, methodParams), method_tid);
H5Tinsert(measure_tid, "Result", HOFFSET(Measure, result), H5T_NATIVE_FLOAT);
hsize_t dim[] = { 1 };
hid_t space = H5Screate_simple(1, dim, NULL);
hid_t dataset = H5Dcreate(objid, name, measure_tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
herr_t ret = H5Dwrite(dataset, measure_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &value);
H5Tclose(method_tid);
H5Tclose(measure_tid);
H5Sclose(space);
H5Dclose(dataset);
写入复合数据类型但缺少methodParams
字段。我猜是因为我没有指示库期望指针位于其位置。我该怎么做?
修改
请考虑结构是否带有指针,因为每个方法(由第一个struct的字段给出)具有不同的 amount 和种参数。当然,一种方法是合并结构第一层上所有方法的所有参数,这是我想要避免的。
答案 0 :(得分:2)
H5Tinsert()调用只是为存储布置字节,实际上该结构中的内容是指针,而不是指向的东西。除了填充之外,发送库的内存包括int,指针和float。该库将根据您在H5Tinsert()调用中的类型排列方式,尝试对该内存进行切片和切块。它不会解决复杂数据结构中的指针(人们在尝试发送使用HDF5指针构建的多维数组时经常会对此感到困惑。)
最直接的做法是修改你的结构,看起来像这样:
typedef struct{
int32_t method;
int32_t param1;
int32_t param2;
float result;
}hdf5_Measure;
并手动填写,至少对于HDF5 I / O.