如何获得通用的fortran输入值

时间:2019-06-05 19:33:35

标签: fortran hdf5 fortran90

我只是在整理并尝试清理一些使用HDF5库的Fortran代码。在该库中,有一个定义如下的函数:

SUBROUTINE h5dwrite_f(dset_id, mem_type_id, buf, dims, hdferr, & 
                      mem_space_id, file_space_id, xfer_prp)
  IMPLICIT NONE
  INTEGER(HID_T), INTENT(IN) :: dset_id      ! Dataset identifier
  INTEGER(HID_T), INTENT(IN) :: mem_type_id  ! Memory datatype identifier
  TYPE, INTENT(IN) :: buf                    ! Data buffer; may be a scalar 
                                             ! or an array
  ...

此处的键输入为buf。我的代码中有很多不同的部分都使用此子例程,而包装子例程仅相差一行,而输入类型不同,所以我想对代码进行一些概括。我所有调用此子程序的唯一区别是mem_type_id和传递给buf的值的实际类型。例如,在一个呼叫中,mem_type_idH5T_NATIVE_CHARACTER,而buf是字符串,而在另一个呼叫中,mem_type_idH5T_NATIVE_REAL,而buf是{ {1}}。

我试图复制其子例程声明中的内容,因此我将有一个“类型”输入,但无法编译。

real

有没有一种方法可以满足我的需求?在任何其他语言中,我都会将其描述为希望输入 subroutine StoreDataIntoH5File (vname, vval, mem_type_id) character, intent (in) :: vname*(*) type, intent (in) :: vval ! use generic type statement integer(HID_T), intent(in) :: mem_type_id ! Memory datatype identifier ... call h5dwrite_f (dset_id, mem_type_id, vval, (/1_HSIZE_T/), hdf5_error) 类型,或者在C语言中,我可能会使用object。基本上,此API似乎能够采用通用输入类型,而我正在尝试复制该类型,因为我的子例程正在包装它。

我很高兴走指针路线,基本上我只是想能够为各种输入变量类型共享此子例程,就像它调用的子例程(void*)一样。 / p>

1 个答案:

答案 0 :(得分:0)

在HDF5中,对于所有参数组合,Fortran绑定均过载。您可以执行相同的操作(重载时重复代码),也可以自行处理对C HDF5库的调用。我建议前一种解决方案! (可以通过遍历参数组合来实现自动化)。