gpt4 book ai didi

c - HDF5:复合数据类型写入包含指向另一个结构的指针的结构

转载 作者:太空狗 更新时间:2023-10-29 15:37:35 25 4
gpt4 key购买 nike

我正在尝试向 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 字段。我猜是因为我没有指示图书馆在其位置上期待一个指针。我该怎么做?

编辑

请考虑结构与指针的关系,因为每个方法(由第一个结构的字段给出)具有不同的数量种类 参数。当然,一种方法是合并结构第一层所有方法的所有参数,这是我想避免的事情。

最佳答案

H5Tinsert() 调用只是布置用于存储的字节,实际上在该结构中的是一个指针,而不是指向的东西。除了填充,您发送给库的内存由一个 int、一个指针和一个 float 组成。该库将根据您在 H5Tinsert() 调用中告诉它的类型排列简单地尝试对该内存进行切片和切 block 。它不会解析复杂数据结构中的指针(人们在尝试将使用指针构建的多维数组发送到 HDF5 时常常对此感到困惑)。

最直接的做法是修改您的结构,使其看起来像这样:

typedef struct{
int32_t method;
int32_t param1;
int32_t param2;
float result;
}hdf5_Measure;

并手动填充,至少对于 HDF5 I/O。

关于c - HDF5:复合数据类型写入包含指向另一个结构的指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46370258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com