Мне нужно прочитать набор данных HDF5, содержащий массив 3 x 3, тип данных double.
Моя Visual Studio 2017 Pro вылетает при возврате из кода ниже.
В пошаговом режиме с отладчиком этот код считывает двумерный массив из HDF5; Я могу прочитать это в отладчике; но функция read_double_array аварийно завершает работу, когда возвращается к вызывающей стороне.
ВТОРАЯ ПОПЫТКА КОДА ИЗ ПРИМЕРА В STACKO….
public static double[,] read_double_array( H5FileId fileId, string dataset_name, int dim1, int dim2 )
{
double [,] return_data = new double[ dim1, dim2 ];
try
{
H5Array<double> h5_array = new H5Array<double>( return_data );
H5DataSetId double_array_dataset = H5D.open( fileId, dataset_name );
H5D.read<double>( double_array_dataset,
new H5DataTypeId(H5T.H5Type.NATIVE_DOUBLE),
h5_array );
H5D.close(double_array_dataset);
}
catch( HDFException e )
{
Console.WriteLine( e.Message );
int aa=0;
}
return return_data;
}
МОЙ КОД ПЕРВАЯ ПОПЫТКА, КОТОРАЯ РАЗБИЛАСЬ ……………………
public static double[,] read_double_array( H5FileId fileId, string dataset_name, int dim1, int dim2 )
{
double [,] return_data = new double[ dim1, dim2 ];
try
{
H5DataSetId dataSetId = H5D.open( fileId, dataset_name );
H5D.read( dataSetId,
new H5DataTypeId( H5T.H5Type.NATIVE_DOUBLE ),
new H5Array<double>( return_data ) );
}
catch( HDFException e )
{
Console.WriteLine( e.Message );
int aa=0;
}
return return_data; <<<<<<<<<<<<<<<<<< H A N G S H E R E
}





Избавьтесь от серьезной боли (из-за деталей низкоуровневой реализации HDF5) и проверьте HDFql.
Вот решение с использованием HDFql в C# для чтения многомерного (размером 3x3) набора данных с именем dset типа данных double, хранящегося в файле HDF5 с именем test.h5 (предположим, что и файл, и набор данных уже существуют):
// use HDFql namespace (make sure it can be found by the C# compiler)
using AS.HDFql;
public class Test
{
public static void Main(string []args)
{
// declare variables
double [,]data = new double[3, 3];
int x;
int y;
// select (i.e. read) dataset "dset" from HDF5 file "test.h5" into variable "data"
HDFql.Execute("SELECT FROM test.h5 dset INTO MEMORY " + HDFql.VariableTransientRegister(data));
// display content of variable "data"
for(x = 0; x < 3; x++)
{
for(y = 0; y < 3; y++)
{
System.Console.WriteLine(data[x, y]);
}
}
}
}
У меня все заработало. Вот мой код ...
// Reads a 2-dim array of double.
// INPUT: fileId of open HDF5 file
public static bool read_double_array( H5FileId fileId, string dataset_name, int dim1, int dim2, ref double [,] output_double_array )
{
try
{
output_double_array = new double[ dim1, dim2 ];
H5Array<double> h5_array = new H5Array<double>( output_double_array );
H5DataSetId dataset = H5D.open( fileId, dataset_name);
H5D.read<double>( dataset,
new H5DataTypeId(H5T.H5Type.NATIVE_DOUBLE),
h5_array);
}
catch( HDFException e )
{
Console.WriteLine( e.Message );
return false;
}
return true;
}
У меня вопрос о HDF5DotNet. Но спасибо за объявление.