是否可以在Fortran中编写带动态输入的函数?

时间:2015-07-10 23:12:44

标签: fortran

我是fortran的新手,我想知道是否可以用动态输入编写函数或子程序?例如,如果我想要一个函数/子例程:

function/subroutine a (inputs)

  integer, dimension(:), allocatable :: b
  integer :: i,j

  i = number of inputs
  allocate(b(i))

  do j=1,i
    b(i)=input(i)
  end do

end function a

因此,每次调用函数/子例程时,输入的数量都可能不同。有可能吗?

1 个答案:

答案 0 :(得分:3)

当所有参数的类型相同时,您可以将它们传递给数组:

subroutine a(inputs)
    integer :: inputs(:)
    integer,  allocatable :: b(:)
    integer :: i,j

    i = size(inputs)
    allocate(b(i))

    do j=1,i
      b(i)=input(i)
    end do

如果它们的类型不同,您可以使用可选的伪参数。 必须检查每个参数是否存在,然后再访问它。

subroutine a(in1, in2, in3)
    integer :: in1
    real :: in2
    character :: in3

    if (present(in1)) process in1
    if (present(in2)) process in2
    if (present(in3)) process in3

您也可以使用泛型,手动指定所有可能的组合,然后编译器选择正确的特定过程进行调用。查看您最喜欢的教科书或教程了解更多

module m

  interface a
    module procedure a1
    module procedure a1
    module procedure a1
  end interface

contains

   subroutine a1(in1)
     do something with in1
   end subroutine

   subroutine a2(in1, in2)
     do something with in1 and in2
   end subroutine

   subroutine a2(in1, in2, in3)
     do something with in1, in2 and i3
   end subroutine

end module

...
use m
call a(x, y)