HDF5:复合数据类型,用于编写包含指向另一个结构的指针的结构

时间:2017-09-22 17:32:23

标签: c hdf5

我正在尝试向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 参数。当然,一种方法是合并结构第一层上所有方法的所有参数,这是我想要避免的。

1 个答案:

答案 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.