【发布时间】:2014-09-12 08:27:56
【问题描述】:
我目前尝试从 C 语言的 hdf5 数据集中读取一些数据,如下所示。
dataset = H5Dopen(ic_group, 'vx', H5P_DEFAULT);
status = H5Dread(dataset, H5T_NATIVE_FLOAT, memspace,H5S_ALL,
H5P_DEFAULT, vx_ptr);
status = H5Dclose(dataset);
这里ic_group是一个包含数据集vx的组,memspace是内存中的hyperslab,vx_ptr是内存中的数据。这种方法效果很好,但是由于我以后想使用不同的数据类型,所以我想直接从数据集中读取类型:
hid_t datatype;
datatype = H5Dget_type(dataset);
status = H5Dread(dataset, datatype, memspace,H5S_ALL,
H5P_DEFAULT, vx_ptr);
不幸的是,这种方法会导致函数 H5Dread 出现段错误。
也许我错过了什么?感谢您的任何建议。
编辑:我不知道这是否有用,但 gdb 的回溯可以归结为
0x00007ffff5adbd1e in __memcpy_ssse3_back () from /lib64/libc.so.6 。
【问题讨论】:
-
您是否在认真检查您存储的状态值?如果不是,您如何知道首先报告故障的位置?
-
我打印了状态值,每次都得到 0 作为回报,所以这应该没问题。此外,我查看了数据类型 id,即 50331962(在转换为 int 之后),文档说返回
H5Dget_type的非负值是成功的操作。我用 GDB 调试了程序,所以我知道段错误发生在 H5Dread 中(见编辑) -
我下载了HDF5源代码并编译;产生了大量令人沮丧的警告(我在 Ubuntu 14.04 衍生版本上使用 GCC 4.9.1 进行编译)。有些警告是不必要的;其他人显然没有必要(我担心他们)。很少有开源项目在默认编译时会产生如此多的警告;这让我很担心。我需要时间来学习足够的知识以正确使用 HDF5;鉴于我不打算使用 HDF5,我不确定我是否愿意将时间花在这项任务上。
-
这可能是用于读取和写入数据集的数据类型不匹配。您可以使用
H5Tequal()来检查H5Dget_type(dataset)是否与用于写入数据的数据类型相同。您可能还需要使用H5Sget_select_type()来检查memspace的数据类型。 -
好的,感谢H5Tequal,我得到了错误,谢谢!实际上,这是在创建不同数据集时出现的问题,其中一个是意外创建为
float64类型的,因此此错误仅影响一个数据集,导致段错误。在整个节目中。也许你可以以某种方式发布这个作为答案,我会给你一个赞成票。