HDF5: создание набора данных со строкой

Я использую 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думая, что, может быть, если бы он выделил память непосредственно перед записью, это сработало бы, но … этого не произошло.

Теперь я застрял и не знаю, что делать.

Я что-то пропустил ?

4

Решение

Ваш mem_type_id вдвойне недействительным:

  • второй аргумент H5Tcreate должен быть размер составного типа данных
  • в H5Tinsertпоследний аргумент должен быть типом данных вставленного поля. Здесь, я думаю, вы имели в виду mem_type вместо mem_type_id,

Я ничего не знаю о том, что вы делаете, в частности, но для написания строки переменной длины вам не нужно ни создавать составной тип, ни устанавливать какие-либо специальные списки свойств. В принципе, вашей первой 3-й строки достаточно, чтобы создать правильный тип строки переменной длины (mem_type). Затем вы создаете простое пространство данных, затем набор данных.

Посмотри на этот пример, вы увидите, это довольно просто.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]