fortran函数/子例程中的任意变量/数组类型

时间:2014-01-14 09:08:01

标签: variables fortran subroutine

我希望这不是一个太愚蠢的问题,但有可能有函数或子程序,我可以传递数组的类型,如

subroutine foo(array, arr_type)
implicit none
arr_type, dimension(:) :: array

*Do something with array* 
end subroutine

还是我必须为每个可能的arr_type写一个子程序(例如整数,双精度,......)并用接口重载子程序?

2 个答案:

答案 0 :(得分:3)

是和否......您可以使用接口将多个函数/子例程与不同的伪参数捆绑在一起:

module foos
  interface foo
    module procedure foo_real
    module procedure foo_int
  end interface

contains

  subroutine foo_real( a )
    implicit none
    real,intent(inout) :: a(:)

    ! ...
  end subroutine

  subroutine foo_int( a )
    implicit none
    integer,intent(inout) :: a(:)

    ! ...
  end subroutine
end module

我知道没有(简单)传递具有任意 basic 类型的数组的可能性。你可以看看transfer - 但是有龙; - )

答案 1 :(得分:0)

您可以尝试使用Fortran 2003的无限多态。写下你的子程序有点像这样:

subroutine foo(array)
implicit none
class(*), dimension(:) :: array

! Do something with array

end subroutine

从缩写代码的角度来看,这不会为你节省太多,因为你可能需要编写像

这样的东西
use, intrinsic :: iso_fortran_env, only : real32, real64
.
.
.
select type (element=>array(1))
type is (real(real32))
    ! Code for 32-bit reals
type is (real(real64))
    ! Code for 64-bit reals
type is (integer)
    ! Code for integers of default kind
class is (shape)
    ! Code for shapes
class default
    ! Sweep up everything else
end select

但是你最终可能会写出尽可能多的线条,就像你遵循亚历山大·沃格特完全明智的做法一样。

编辑后,发表评论

这种方法不会提供什么,因为Fortran不在任何类型的层次结构中包含其内在类型,是一个代码,如

select type (element=>array(1))
class is (number)
    ! Code for any type and kind of Fortran number

那会很有用,但我不认为它会很快发生。