fortran - 在 Fortran 中获取 HDF5 文件名的长度?
问题描述
我试图在 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)
解决方案
可以通过将文件名变量声明为指针并在初始调用 h5fget_name_f 之前将其无效来传递空值:
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(:), pointer::filename
integer(SIZE_T)::size = 50
!! Length of filename
integer::hdferr
!! HDF5 error code
nullify(filename)
call h5fget_name_f(obj_id, filename, size, hdferr)
! HDF5 needs one more character (probably for the null character terminating the string), so we allocate filename to length size+1
allocate (character(size+1)::filename)
call h5fget_name_f(obj_id, filename, size, hdferr)
! Remove last character from the returned string
filename => filename(1:size)
end function get_hdf5_filename
请注意,h5fget_name_f 在传递的字符串中需要一个额外的字符(可能用于终止空字符),因此必须为名称指针分配比 size 参数中设置的值长一个字符。filename => filename(1:size)
可以通过使用数组切片语法(在上面的示例中)将文件指针重定向到排除最后一个字符的子集来删除终止的 null 。
推荐阅读
- c# - 仅当输入为数组时才将类调用为数组
- mysql - 无法在 ubuntu 21.04 上运行 mysql
- algorithm - Algorithm to find all solutions for a boolean sum of products without negation
- go - 更改 2D 数组变量也会更改原始 2D 数组变量。为什么?
- windows - Powershell - 嵌套 IF 在 Do-While 循环中无法正确执行
- php - 在条件下重用表单 HTML 元素
- protocol-buffers - 为什么 protobuf 的 FieldMask 使用字段名而不是字段号?
- cross-reference - 检索给定年份科学论文的引用次数
- python - 删除所有邀请的事件,除非它来自某个公会
- python - 在python中,如何根据具有下限和上限的查找表对范围进行分类