Je suis en train d'écrire un HDF5 struct qui contient un pointeur vers une autre. Quelque chose comme ceci:HDF5: type de données composé à écrire un struct contenant un pointeur vers un autre struct
typedef struct{
int32_t method;
void* methodParams;
float result;
}Measure;
typedef struct{
int32_t param1;
int32_t param2;
}OneMethod;
Le code suivant pour décrire le type de données composé ne fonctionne pas:
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);
le composé est écrit mais datatype le champ methodParams
manque. Je suppose que je n'invite pas la bibliothèque à attendre un pointeur à sa position. Comment dois-je faire?
EDIT
S'il vous plaît considérer que la struct est avec le pointeur, car chaque méthode (donnée par le premier champ de struct) a différentes quantités et types de paramètres. Bien sûr, un moyen serait de fusionner tous les paramètres de toutes les méthodes sur le premier niveau de la structure, ce que je voudrais éviter.
merci, je comprends, mais cela est déjà quelque chose que je considérais et je voudrais éviter. S'il vous plaît voir mes modifications. Une autre idée? –
Il n'y a pas de moyen simple de faire ce que vous voulez faire. –
Les appels d'E/S de la bibliothèque HDF5 consomment et émettent des tampons de données avec une transformation minimale. Fondamentalement juste de type conversion et (compression) filtres. Ils ne chassent pas les pointeurs ou n'aplatissent pas les structures de données compliquées pour vous. L'emballage et le déballage des données sont à la charge du client. –