我试图从HDF5文件中预加载一堆矩阵并将它们存储在一个动态数组中。但是,我无法像我希望的那样让它工作。 由于某种原因我无法弄清楚,整个数组被覆盖而不是子数组。任何想法如何解决?
这是我的代码:
short ***data[line_count];
short** dset_data;
for (int file_index = 0; file_index < line_count; ++file_index){
dset_data = (short**) malloc(DIM_Y * sizeof(short*));
dset_data[0] = (short*) malloc(DIM_Y * DIM_X * sizeof(short));
for (int i=1; i < DIM_Y; i++)
dset_data[i] = dset_data[0] + i * DIM_X;
for (int y = 0; y < DIM_Y; y++) {
for (int x = 0; x < DIM_X; x++) {
dset_data[y][x] = 0;
}
}
/* Open an existing file. */
file_id = H5Fopen(input_files[file_index], H5F_ACC_RDONLY, H5P_DEFAULT);
/* Open an existing dataset. */
dataset_id = H5Dopen2(file_id, "data/data", H5P_DEFAULT);
/* Read dataset */
status = H5Dread(dataset_id, H5T_NATIVE_SHORT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &dset_data[0][0]);
/* Store two dimensional array at n-th position in data array */
data[file_index] = &dset_data;
/* Close the dataset. */
status = H5Dclose(dataset_id);
/* Close the file. */
status = H5Fclose(file_id);
}
答案 0 :(得分:0)
将评论,减去对三星级数据的下意识反应转换为答案。
data
声明:
short ***data[line_count];
以及分配给它的行:
data[file_index] = &pset_data;
是麻烦的根源。您将在每次迭代时存储局部变量的地址 - 相同的局部变量。这不是你想要的;您希望存储在pset_data
中保存的值,而不是存储该值的地址。
快速解决方法是从data
中丢失一颗星:
short **data[line_count];
然后将作业更改为:
data[file_index] = pset_data;
这应该是此代码中所需的全部内容。使用data
的代码需要进行相应的调整。
如果你考虑一下,data
是一组2D数据集;只需要数据的两个星和数组的下标。根据结构类型的数组来思考可能是明智的,其中结构类型封装一个数据集 - 它将包括指向数据本身的指针,并且可能还包括大小信息,并且可能它将存储文件它来自或关于数据集的其他元数据。这样可以避免多星问题。当你有三颗星时,很难跟踪发生了什么。如果您真的拥有N维数据,那么您可能需要在声明中使用N星,但辅助数据结构也会变得越来越rococo。但目标是避免三星指针。正如评论中所指出的那样,Three-Star Programmer不是一个免费的加词。偶尔 - 非常偶尔 - 这是必要的。这通常是不必要的,应该尽可能避免。