Чтение файлов hdf5 в динамические массивы в переполнении стека

Я пытаюсь прочитать большие трехмерные файлы hdf5 в динамический массив из-за ограничений размера в стеке. Я пробовал несколько разных методов и потерпел неудачу из-за ошибки сегментации. Ниже приведен пример кода, чтобы показать мою проблему. Я был бы очень признателен за помощь!

//This example was based on several examples which came in the c++ examples directory of the hdf5 package.#ifdef OLD_HEADER_FILENAME
#include <iostream.h>
#else
#include <iostream>
#endif
#include <string>
#include <new>
#include "hdf5.h"
#include "H5Cpp.h"
#ifndef H5_NO_NAMESPACE
using namespace H5;
#endif

const H5std_string  FILE_NAME( "Test.h5" );
const H5std_string  DATASET_NAME( "Identity" );
const int   NX = 3;                    // dataset dimensions
const int   NY = 3;
const int   RANK = 2;

using namespace std;

int main (void)
{

int buffer[3][3];//  Make Identity Matrix for fill.
for(int i=0; i<NX; i++){
for(int j=0; j<NY; j++){
if(i==j) buffer[i][j] = 1;
else buffer[i][j]=0;
}
}
cout << "Lets check we filled it correctly: " << endl;
//  First let's check we do have I matrix

for(int i=0; i<NX; i++){
for(int j=0;j<NY;j++){
cout << buffer[i][j] << "  ";
} cout << endl;
}//  Now let's write into a file
H5File file( FILE_NAME, H5F_ACC_TRUNC );
hsize_t     dimsf[2];
dimsf[0] = NX;
dimsf[1] = NY;
DataSpace dataspace( RANK, dimsf );
IntType datatype( PredType::NATIVE_INT );
datatype.setOrder( H5T_ORDER_LE );
DataSet dataset = file.createDataSet( DATASET_NAME, datatype, dataspace );
dataset.write( buffer, PredType::NATIVE_INT );//  Ok great, now let's try opening this array using both static and dynamic(new) type arrays:

H5File file1( FILE_NAME, H5F_ACC_RDONLY );
DataSet dataset1 = file1.openDataSet( DATASET_NAME );

/*
* Get filespace for rank and dimension
*/
DataSpace filespace = dataset1.getSpace();

/*
* Get number of dimensions in the file dataspace
*/
int rank = filespace.getSimpleExtentNdims();

/*
* Get and print the dimension sizes of the file dataspace
*/
hsize_t dims[2];    // dataset dimensions
rank = filespace.getSimpleExtentDims( dims );
/*
* Define the memory space to read dataset.
*/
DataSpace mspace1(RANK, dims);int newbuffer[NX][NY]; //static array.
int **p2DArray;

p2DArray = new int*[NX];
for (uint i = 0; i < NX; ++i) {
p2DArray[i] = new int[NY];
}

dataset1.read( newbuffer, PredType::NATIVE_INT, mspace1, filespace );
dataset1.read( p2DArray, PredType::NATIVE_INT, mspace1, filespace );

//  Lastly lets print the arrays to make sure we get the same thing:
cout << "Ok and now for the static array:" << endl;

for(uint i=0; i<NX; i++){
for(uint j=0;j<NY;j++){
cout << newbuffer[i][j] << "  ";
} cout << endl;
}
cout << "Ok and now for the dynamic array:" << endl;

for(uint i=0; i<NX; i++){
for(uint j=0;j<NY;j++){
cout << p2DArray[i][j] << "  ";
} cout << endl;
}

return 0;
}

3

Решение

Ваш p2DArray должен быть простым (1D) массивом int, а не массив массивов. Вот что read метод ожидает.

Просто выделите достаточно места для хранения номеров NX * NY:

int *p2DArray = new int[NX*NY];

и затем получить доступ к массиву, используя следующую формулу: p2DArray [i] [j] = p2DArray [i * NY + j].

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]