2017-09-22 65 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場丟失。我想是因爲我沒有指示圖書館期待指針在它的位置。我該怎麼做?

編輯

請考慮該結構是與指針,因爲每一種方法(由第一個結構的字段中給出)具有不同的的參數。當然,一種方法是合併結構第一層所有方法的所有參數,這是我想避免的。

回答

2

H5Tinsert()調用只是放置存儲的字節,而實際上在那個結構中的是一個指針,而不是指向的東西。一邊填充,你發送庫的內存由一個int,一個指針和一個浮點數組成。根據你所說的關於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調用以最少的轉換消耗和發送數據緩衝區。基本上只是類型轉換和(壓縮)過濾器。它們不會爲您追逐指針或爲複雜的數據結構鋪平道路。包裝和拆包數據取決於客戶。 –

相關問題