2017-09-22 2 views
4

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.

Répondre

2

Les appels H5Tinsert() sont tout simplement traçons les octets pour le stockage et ce qui est réellement dans cette struct est un pointeur, pas la chose souligné. Rembourrage mis à part, la mémoire que vous envoyez à la bibliothèque se compose d'un int, d'un pointeur et d'un flottant. La bibliothèque essaiera simplement de découper et de couper cette mémoire en fonction de ce que vous lui avez dit à propos de l'arrangement de type dans les appels H5Tinsert(). Il ne résoudra pas des pointeurs dans les structures de données complexes (les gens sont souvent confus au sujet de quand ils essaient d'envoyer des tableaux multidimensionnels construits avec des pointeurs vers HDF5).

La chose la plus simple à faire serait de réviser vos struct à ressembler à quelque chose comme ceci:

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

et remplir manuellement que, au moins pour HDF5 E/S.

+0

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? –

+0

Il n'y a pas de moyen simple de faire ce que vous voulez faire. –

+0

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. –