如何在Fortran 90中执行名称在运行时中已知的子例程?

时间:2013-01-11 13:39:33

标签: command-line-arguments fortran90 subroutine

假设我在Fortran中有一个带有各种子程序的程序,我不知道先验所有子程序,并且用户通过命令行提供其中一个的名称,如下所示:

    program subroutine_name

因此,我将子例程名存储在字符变量中。这样,我就不能声明外部变量来存储子程序。那么,我怎么称它只知道它的名字呢?是否有可能通过这种方式,还是有另一种方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

没有办法编写Fortran语句,例如

call character_variable_containing_subroutine_name

与Fortran等静态类型编译语言不同,它提供了这种设施。

当然,如果你问过我可以为Fortran程序提供一个输入参数,它将在运行时确定程序执行的路径,那么答案就是当然。我会忽略您的情况的任何复杂情况,并假设您要拨打sincostan之一。

首先,将程序参数的文本捕获到一个字符变量中:

character(len=*) :: user_choice
...
call get_command_argument(1,user_choice)
...
select case (user_choice)
case ('sin')
   ... do stuff with sin
case ('cos')
   ... do stuff with cos
case ('tan')
   ... do stuff with tan
case default
   ... do whatever
end select

您可以使用过程指针使其更加精细。例如,您可以定义:

pointer :: rp
interface
 real function rp(inval)
    real, intent(in) :: inval
  end function rp
end interface

然后用以下内容替换select case构造的第一个版本:

select case (user_choice)
case ('sin')
   rp => sin
case ('cos')
   rp => cos
case ('tan')
   rp => tan
case default
   ... do whatever
end select

这可能会简化以后的代码。我想这也可能会让它更复杂。

请注意,我没有测试任何这些片段,我的语法可能有点不可思议。