2015-03-18 3 views
0

Я хотел бы записать данные, которые содержатся в контейнере STL в файл HDF5. Из того, что я собрал, мне нужно объявить смежный блок памяти и использовать API "hdf5.h" C для переноса данных из буфера памяти на диск.Структура переменной длины HDF5 переменной длины (C API)

Для регулярных dataspaces процедура проста; нужно только создать временные массивы в стеке с new. HDF5 «понимает» такие макеты памяти. Это другая история, когда речь идет о нерегулярных датах, потому что должен использоваться выделенный тип hvl_t.

Следующий фрагмент кода работает, но не ISO C++ (11):

// Test data 
std::vector< std::vector<int> > jagged_array(3); 
jagged_array[0] = {0}; 
jagged_array[1] = {0, 1, 2, 3}; 
jagged_array[2] = {0, 1, 2}; 

hvl_t X[jagged_array.size()]; 
for (unsigned int i = 0; i < jagged_array.size(); ++i) { 
    X[i].len = jagged_array[i].size(); 
    int * ptr = (int *) malloc (X[i].len * sizeof(int)); 
    for (unsigned int j = 0; j < X[i].len; ++j) { 
     ptr[j] = jagged_array[i][j]; 
    } 
    X[i].p = (void *) ptr; 
} 

Мой С чрезвычайно ржавый; этот фрагмент почти полностью сорван с примера страницы HDF5, за исключением незаконной строки hvl_t X[jagged_array.size()];.

Как я могу объявить hvl_t с размером, определенным во время выполнения? Он, безусловно, включает в себя malloc, но я действительно в тупике.

+1

вы пробовали 'hvl_t * X = таНос (hvl_t *) (jagged_array.size() * SizeOf (hvl_t)) ; '? –

+0

Спасибо за быстрый ответ @Lashane. Я просто попытался, он дал ошибку 'ошибка: недействительное преобразование из 'void *' в 'hvl_t *'' – jgyou

+1

спасибо за сообщение об ошибке, я добавил листинг к образцу –

ответ

0

@Lashane ответил в комментариях:

Нужно просто использовать

hvl_t * X = (hvl_t *)malloc(jagged_array.size() * sizeof(hvl_t)) 
Смежные вопросы