我是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
因此,每次调用函数/子例程时,输入的数量都可能不同。有可能吗?
答案 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)