2017-09-22 22 views
4

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フィールドが欠落しています。私はライブラリがその位置にポインタを期待するように指示していないので推測します。どうすればいいですか?

EDIT

は、(最初​​の構造体のフィールドによって与えられた)それぞれの方法が異なる種類のパラメータのを持っているので、構造体のポインタであることをご検討ください。もちろん、構造体の最初のレベルのすべてのメソッドのすべてのパラメータをマージする方法がありますが、これは避けたいものです。

答えて

2

H5Tinsert()呼び出しは、格納するためのバイトをレイアウトするだけで、実際には構造体にポインタがあり、指されているものではありません。パディングを別にすると、ライブラリを送信するメモリは、int、ポインタ、およびfloatで構成されます。ライブラリは、H5Tinsert()呼び出しの型の配列について、あなたが言ったことに従って、そのメモリをスライスしてサイコロしようとします。複雑なデータ構造のポインタは解決されません(HDF5へのポインタで構築された多次元配列を送信しようとすると、このことについてよく混乱します)。

このような何かを見て、あなたの構造体を修正するだろう行うには最も簡単なもの:手動

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

そして、それを埋める、少なくともHDF5 I/Oのために。

+0

ありがとう、私はそれを理解していますが、これは私がすでに考えているものであり、避けたいものです。私の編集内容を見てください。他のアイデア? –

+0

あなたがしたいことをするための簡単な方法はありません。 –

+0

HDF5ライブラリのI/Oコールは、最小限の変換でデータのバッファを消費し、放出します。基本的に変換と(圧縮)フィルタを入力するだけです。ポインタを追跡したり、複雑なデータ構造を平坦化することはありません。データのパッキングとアンパックは、クライアントに任されます。 –

関連する問題