子程序的名称可以是 Fortran 中的变量吗?

The name of a subroutine can be a variable in Fortran?

我想知道在 Fortran 中是否有类似的东西。当然这个例子不能编译,但我想你可以理解。

program test
    character(1):: sub

    sub='A'
    call sub

    sub='B'
    call sub
end program

subroutine A
    print*,'OK! A'
end subroutine A

subroutine B
    print*,'OK! B'
end subroutine B

最接近的是 function/procedure 指针,但那是 fortran-2003。基本上,给定输入 'A' 或 'B',您将指针设置为指向 subroutine Asubroutine B。更多详情请见 How to alias a function name in Fortran

您无法通过设置字符变量来完成此操作,但您可以使用过程指针来完成此操作。我稍微修改了你的例子来实现它。参见:

program test
 implicit none

 abstract interface
    subroutine no_args
    end subroutine
 end interface

 procedure(no_args), pointer :: sub => null()

 sub => A
 call sub

 sub => B
 call sub

contains

subroutine A
 implicit none
 print *,"OK! A"
end subroutine

subroutine B
 implicit none
 print *,"OK! B"
end subroutine

end program

变化是:

  • 为过程指针定义一个接口
  • sub 声明为指向该抽象接口的过程指针

然后您可以将 sub 分配给不带参数的子例程(因为这是接口所说的)并通过 sub 您设想的方式调用它们。