2015-10-09 1 views
0

Возможно ли это сделать?читать только длину массива переменной длины без чтения элементов в hdf5

У меня есть массив, содержащий NvlHDF5-variable-length-arrays, уже записанный в файл hdf5. Я могу прочитать в целых данных (следующего фрагмента кода в C++, но ответы, используя версию C из hdf5 API одинаково приветствуются)

hvl_t vl[Nvl]; 
dset.read(vl, VarLenType(&PredType:NATIVE_INT)); 

Однако, если я только хочу, чтобы прочитать длину каждого объект переменной длины, то есть vl[i].len (для i=0 до Nvl-1), как я могу это сделать, не читая данные vl[].p?

+0

Да, использование тегов C и C++ является подходящим, потому что обертка HDF5 C++ очень тесно связана с ссылочным C API. – Simon

+0

@Simon: Это не очень хорошая причина. Пометьте язык, который вы используете. Не какой-то другой язык, какой-то другой язык, который выглядит немного то же самое, или какой-то другой язык, на котором была написана библиотека. Язык, который вы _actually using_. –

ответ

1

Да, это можно сделать, даже если нет прямого вызова функции, чтобы получить его. Вы должны прибегнуть к эквиваленту макроса размера классического массива в C: sizeof(x)/sizeof(x[0]).

Если ваш массив переменной длины имеет тип vl_type, вы можете получить его размер в байтах с vl_size = H5Dvlen_get_buf_size(vl_type). Затем вам нужно разделить этот размер на размер в байтах типа элементов. Этот тип можно найти с помощью elem_type = H5Tget_super(vl_type) и его размер в байтах с elem_size = H5Tget_size(elem_type).

Наконец, у вас есть длина массива переменной длины: vl_size/elem_size.

PS: Я использовал API C здесь, потому что документация лучше, но она работает на C++.

+0

Это не рекомендуемый способ получить размер массива на C++. Это склонно к ошибкам и опасно. Узнайте, почему важны точные языковые метки? Это сказано ... Я даже не знаю, как еще вы это сделаете с VLA. В основном потому, что VLA не существуют на C++. Узнайте, почему важны точные языковые метки? –

+0

@LightnessRacesinOrbit Тогда вы также можете удалить тег C++, потому что язык не имеет отношения к вопросу: D – Simon

+0

@Si mon: Было ли это правдой, вопрос был бы неактивным, тема. –

0

После ответа Саймона, прокручивая элементы с помощью hyperslab, а затем запросите размер каждого элемента, выполните задание.

hsize_t dim[1]; 
VarLenType vl_t(PredType:NATIVE_INT); 
DataSpace dspace=dset.getSpace(); 
dspace.getSimpleExtentDims(dim); 
hsize_t count[]={1}, offset[]={0}, stride[]={1}, block[]={1}; 
for(offset[0]=0;offset[0]<dim[0];offset[0]++) 
{ 
     dspace.selectHyperslab(H5S_SELECT_SET, count, offset, stride, block); 
     cout<<dset.getVlenBufSize(vl_t, dspace)/vl_t.getSuper().getSize()<<" "; 
} 
Смежные вопросы