【发布时间】:2021-08-30 18:01:51
【问题描述】:
我正在尝试在 Fortran 中获取 HDF5 对象的文件名,为此我事先不知道文件名的长度。 HDF5 文档说这可以通过将 NULL 传递给 h5fget_name 来完成:
如果决定所需大小值的名称长度未知,则可以通过将名称设置为 NULL 来进行初步 H5Fget_name 调用。
但是,目前尚不清楚如何从 Fortran 代码中完成此操作。根据文档中的上述语言,这样的事情应该可以工作:
function get_hdf5_filename(obj_id) result(filename)
use hdf5
use iso_c_binding, ONLY: c_null_ptr
! Arguments
integer(HID_T), intent(in)::obj_id
!! Handle of HDF5 object
! Result
character(:), allocatable::filename
integer(SIZE_T)::size = 0
!! Length of filename
integer::hdferr
!! HDF5 error code
call h5fget_name_f(obj_id, c_null_ptr, size, hdferr)
allocate (character(size)::filename)
call h5fget_name_f(obj_id, filename, size, hdferr)
end function get_hdf5_filename
但是,gfortran 不会编译上述内容并给出类型不匹配错误:
Error: Type mismatch in argument 'buf' at (1); passed TYPE(c_ptr) to CHARACTER(1)
【问题讨论】:
-
注意 c_null_ptr 与 NULLified fortran 指针不同