我正在使用HDF5 API,我正在尝试使用可变长度字符串创建数据集。 结构是
struct dataX
{
std::string data;
};
我使用的是char[256]
静态硬编码大小
但我希望它是动态的,所以在阅读HDF5文档后,我发现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
,认为如果它在写作之前分配了内存就可以了,但是......它没有。
现在我被困住了,我不知道该怎么做。
我错过了什么吗?
答案 0 :(得分:1)
你的mem_type_id
双重无效:
H5Tcreate
的第二个参数应该是复合数据类型的大小H5Tinsert
中,最后一个参数应该是插入字段的数据类型。我想你的意思是mem_type
而不是mem_type_id
。我对你正在做的事情一无所知,但是要编写变长字符串,你不需要创建复合类型,也不需要设置任何特殊的属性列表。基本上,您的3个第一行足以创建有效的可变长度字符串数据类型(mem_type
)。然后创建简单数据空间,然后创建数据集。
看看this example,你会发现它非常简单。