2012-12-04 24 views
4

我正在使用HDF5 API,並且正在嘗試創建具有可變長度字符串的數據集。 的結構是HDF5:使用字符串創建數據集

struct dataX 
{ 
    std::string data; 
}; 

我使用char[256]使用靜態硬編碼的大小。
但我希望它是動態的,所以在閱讀HDF5 Doc後,我發現H5T_VARIABLE並按如下方式使用它,但仍然失敗。

H5Dcreate返回一個負值(意味着錯誤)。

hid_t mem_type; 
mem_type = H5Tcopy(H5T_C_S1); 
H5Tset_size(mem_type,H5T_VARIABLE); 

/* Create the memory data type. */ 
if ((mem_type_id = H5Tcreate (H5T_COMPOUND, mem_type)) < 0) { 
    return -1; 
} 
/* Insert fields. */ 
if (H5Tinsert(mem_type_id, "field", 0, mem_type_id) < 0) { 
    return -1; 
} 

/* Create a simple data space with unlimited size */ 
// hsize_t dims[1]={0}; 
// hsize_t maxdimsk[1]={ H5S_UNLIMITED }; 
if ((sid = H5Screate_simple(1, dims, maxdims)) < 0){ 
    return -1; 
} 

/* Modify dataset creation properties, i.e. enable chunking */ 
plist_id = H5Pcreate (H5P_DATASET_CREATE); 
//chunk==1 
if (H5Pset_chunk (plist_id, 1, chunk) < 0){ 
    return -1; 
} 

H5Pset_alloc_time(plist_id, H5D_ALLOC_TIME_EARLY) 
/* Set the fill value using a struct as the data type. */ 
// fill_data=0 
if (fill_data) 
{ 
    if (H5Pset_fill_value(plist_id, mem_type_id, fill_data) < 0){ 
    LOG_ERROR << "cannot fill value " << LOG_ENDL; 
    return -1; 
    } 
} 
else { 
    if (H5Pset_fill_time(plist_id, H5D_FILL_TIME_NEVER) < 0) { 
    LOG_ERROR << "error" << LOG_ENDL; 
    } 
} 

/* Create the dataset. */ 
did = H5Dcreate(loc_id, dset_name, mem_type_id, sid, plist_id) 

我試過H5D_ALLOC_TIME_LATE,想,也許,如果它分配的內存只寫它的工作之前。但它沒有。

現在我卡住了,我不知道該怎麼辦。

我錯過了什麼?

回答

1

mem_type_id雙無效:

  • H5Tcreate第二個參數應該是複合數據類型中H5Tinsert
  • 的大小,最後一個參數應該插入的字段的數據類型。在這裏,我想你的意思是mem_type而不是mem_type_id

我不知道你在做什麼,但是要編寫可變長度的字符串,你不需要創建一個複合類型,也不需要設置任何特殊的屬性列表。基本上,你的第3行足以創建一個有效的可變長度字符串數據類型(mem_type)。然後創建簡單的數據空間,然後創建數據集。

看看this example,你會發現它很簡單。

相關問題