4

HDF5 APIを使用していて、可変長の文字列を使用してデータセットを作成しようとしています。構造体は

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ましたが…うまくいきませんでした。

今、私は立ち往生していて、何をすべきかわかりません。

私は何か見落としてますか ?

4

1 に答える 1

1

あなたのmem_type_id二重に無効:

  • の2番目の引数はH5Tcreate、複合データ型のサイズである必要があります
  • H5Tinsert、最後の引数は挿入されたフィールドのデータ型である必要があります。ここで私はあなたがmem_typeの代わりに意味したと思いますmem_type_id

特に何をしているのかわかりませんが、可変長の文字列を書くために、複合型を作成したり、特別なプロパティリストを設定したりする必要はありません。基本的に、最初の3行で、有効な可変長文字列データ型(mem_type)を作成できます。次に、単純なデータスペースを作成し、次にデータセットを作成します。

この例を見てください。非常に単純であることがわかります。

于 2012-12-06T10:49:08.140 に答える