Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得通用fortran输入值_Fortran_Hdf5_Fortran90 - Fatal编程技术网

如何获得通用fortran输入值

如何获得通用fortran输入值,fortran,hdf5,fortran90,Fortran,Hdf5,Fortran90,我只是拿起,并试图清理,一些Fortran代码,利用HDF5库。在该库中有一个定义如下的函数: 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

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

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\u type\u id
和传递给
buf
的值的实际类型。例如,在一个调用中,
mem\u type\u id
H5T\u NATIVE\u字符
buf
是字符串,而在另一个调用中,
mem\u type\u id
H5T\u NATIVE\u REAL
buf
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)
有没有办法做到我想要的?在任何其他语言中,我都会把它描述为想要一个类型为
object
的输入,或者在C语言中,我可能会使用
void*
。基本上,这个API似乎能够接受一个通用输入类型,我正在尝试复制它,因为我的子例程正在包装它


我很乐意走指针路线,基本上我只想能够为各种输入变量类型共享此子例程,就像它调用的子例程(
h5dwrite_f
)一样。

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

你确定这是
类型
而不是
类型(*)
?@francescalus我一点也不确定。。。这是我要尝试的事情清单@francescalus没有,尝试了
类型(*)
,但没有成功。仍然有编译错误,它似乎认为我试图做一个
类型
声明。查看了HDF5文档后,我发现他们确实单独使用
类型
。这不是有效的Fortran,而是“任意Fortran类型”的缩写。您可以查看安装中提供的HDF5API以了解更多详细信息(如果可以找到的话)。您还可以使用
type(c\u ptr)查看Fortran 2003 API
。我确认francescalus的评论:文档中声明了
类型
,但是库实际上分别实现了许多参数类型的例程,并将子例程合并到一个接口名中。嗯,我试图做的全部工作就是避免这种情况。我有一个函数可以向H5写东西,比如说20行,其中2行是HDF5调用,需要知道数据类型。目前,我有许多版本的这些函数(用于不同的维度数组和数据类型),我正试图尽可能地整合它们。如果我重载一个共享的子例程名称,我仍然需要将每个实现分开。