Я хотел бы записать данные, которые содержатся в контейнере 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
, но я действительно в тупике.
вы пробовали 'hvl_t * X = таНос (hvl_t *) (jagged_array.size() * SizeOf (hvl_t)) ; '? –
Спасибо за быстрый ответ @Lashane. Я просто попытался, он дал ошибку 'ошибка: недействительное преобразование из 'void *' в 'hvl_t *'' – jgyou
спасибо за сообщение об ошибке, я добавил листинг к образцу –