Я никогда раньше этого не видел, но у меня есть файл с набором данных 1x1, где единственным значением является массив[3] 64-битной плавающей запятой. Я вижу это с помощью инструмента HDFView, но что бы я ни пытался, я получаю ошибки. Есть ли специальный тип, который мне нужно создать, чтобы это работало?
Редактировать, если я использую H5Sget_simple_extent_npoints() для получения количества точек данных, результат равен 1. Таким образом, это выглядит как 1 массив из 3 элементов.
Последнее, что я пробовал, это вручную читать 3 двойника:
hid_t dataset = ...; // open the dataset (dataset is valid)
double var[3];
hsize_t memdim[] = { 3 };
hid_t space = H5Screate_simple(1, memdim, nullptr); // (space is valid)
auto rc = H5Dread(dataset, H5T_NATIVE_DOUBLE, space, space, H5P_DEFAULT, &var[0]);
// rc = -1
Также попытался просто прочитать весь набор данных:
hid_t dataset = ...; // open the dataset (dataset is valid)
double var[3];
auto rc = H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &var[0]);
// rc = -1
Текст ошибки из приведенных выше тестов:
HDF5-DIAG: Error detected in HDF5 (1.10.5) thread 17272:
#000: \hdf5-1.10.5\src\H5Dio.c line 199 in H5Dread(): can't read data
major: Dataset
minor: Read failed
#001: \hdf5-1.10.5\src\H5Dio.c line 467 in H5D__read(): unable to set up type info
major: Dataset
minor: Unable to initialize object
#002: \hdf5-1.10.5\src\H5Dio.c line 983 in H5D__typeinfo_init(): unable to convert between src and dest datatype
major: Dataset
minor: Feature is unsupported
#003: \hdf5-1.10.5\src\H5T.c line 4546 in H5T_path_find(): can't find datatype conversion path
major: Datatype
minor: Can't get value
#004: \hdf5-1.10.5\src\H5T.c line 4762 in H5T__path_find_real(): no appropriate function for conversion path
major: Datatype
minor: Unable to initialize object





Если вы не привязаны к конкретной библиотеке HDF5, вы можете проверить HDFql, так как это значительно облегчает вам работу с низкоуровневыми деталями HDF5.
Чтобы прочитать и отобразить набор данных одномерного массива (с именем dset) с размером 3 типа данных double (64 бита), это можно сделать следующим образом, используя HDFql в C++:
HDFql::execute("SELECT FROM dset");
while(HDFql::cursorNext() == HDFql::Success)
{
cout << *HDFql::cursorGetBigint() << endl;
}
В качестве альтернативы, вместо использования курсора HDFql, вы можете напрямую заполнить свою переменную значениями набора данных dset следующим образом:
double values[3];
HDFql::variableRegister(&values);
HDFql::execute("SELECT FROM dset INTO MEMORY 0");
for(int i = 0; i < 3; i++)
{
cout << values[i] << endl;
}
Спасибо за это. К сожалению, я привязан к низкоуровневой библиотеке HDF5. Это устаревшее приложение. Просто нужно это небольшое обновление для поддержки массивов внутри наборов данных.
Я понял, что есть тип массива, который можно сделать требуемым:
hsize_t size = { 3 };
hid_t type = H5Tarray_create(H5T_NATIVE_DOUBLE, 1, &size);
hid_t dataset = H5Dopen(...);
double var[3];
hsize_t memdim[] = { 1 }; // or how many arrays[3]'s to read
hid_t space = H5Screate_simple(1, memdim, nullptr);
auto rc = H5Dread(dataset, type, space, H5S_ALL, H5P_DEFAULT, &var[0]);
Я не программирую на C++, поэтому не могу помочь. Если вы не получили ответ на SO, спросите у умных людей на Форум группы HDF