【发布时间】:2018-08-13 01:50:41
【问题描述】:
我在 QT 中有一个程序,它创建一个 HDF5 数据集并将其保存在磁盘中。
一开始我定义了这个数组:
int data[dataNumber][dataFilter][dataWidth][dataHeight];
dataNumber=400000,dataFilter=1,dataWidth=2,dataHeight=2 在这个循环中我在这个数组中设置了一个相同的值(当然是为了简单起见):
for (int i = 0; i < dataNumber; i++)
for (int j = 0; j < dataFilter; j++)
for (int k = 0; k < dataWidth; k++)
for (int l = 0; l < dataHeight; l++)
data[i][j][k][l]=2;
之后我使用这些命令创建了HDF5 数据集:
// Create a new file using the default property lists.
H5File file(FILE_NAME, H5F_ACC_TRUNC);
datadims[0] = dataNumber;
datadims[1] = dataFilter;
datadims[2] = dataWidth;
datadims[3] = dataHeight;
IntType datatype( PredType::NATIVE_INT );
datatype.setOrder( H5T_ORDER_LE );
DataSpace dataspace(4, datadims);
// Create the dataset.
DataSet dataset = file.createDataSet("data", datatype, dataspace);
dataset.write(data, PredType::NATIVE_INT);
一切都很好。
但是当我设置 dataWidth=4,dataHeight=4 时,segmentation fault 发生了,我认为堆栈的保留大小导致了这个问题,我应该使用 Dynamic memory allocation。
所以我更改了data 数组,如下所示:
int ****data ;
data = new int***[dataNumber];
for( int i = 0 ; i < dataNumber ; i++ )
{
data[i] = new int**[dataFilter] ;
for( int j = 0 ; j < dataFilter ; j++ )
{
data[i][j] = new int*[dataWidth] ;
for( int k = 0 ; k < dataWidth ; k++ )
data[i][j][k] = new int[ dataHeight ] ;
}
}
但是使用这个之后:
DataSet dataset = file.createDataSet("data", datatype, dataspace);
dataset.write(data, PredType::NATIVE_INT);
HDF5 数据集有很多错误的数字,例如 -1865382688 和 -1720619824,而不是 true number=2。
现在我不知道如何解决这个问题。我希望有人可以提供帮助。
【问题讨论】:
-
int data[dataNumber][dataFilter][dataWidth][dataHeight];是一块连续的内存。您在“修复”中所做的创建了大量指向不连贯的内存块的指针。 -
在你的程序中有
dataNumber、dataFilter、dataWidth和dataHeight常量吗? -
@RichardCritten 谢谢,你是对的,但我认为这不是我的问题。
-
@Bob__ 不,但如果我将它们用作常量变量,问题仍然存在。
标签: c++ arrays dynamic-memory-allocation hdf5