1

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

    程序 subroutine_name

因此,我将subroutine_name存储在字符变量中。这样,我就不能声明一个外部变量来存储子程序了。那么,我怎么能只知道它的名字来称呼它呢?有可能通过这种方式,还是有其他方法可以做到这一点?

4

1 回答 1

2

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

call character_variable_containing_subroutine_name

它违背了静态类型编译语言(如 Fortran)提供这种功能的方式。

当然,如果您问过我能否向 Fortran 程序提供一个输入参数,该程序将在运行时确定程序采用的执行路径,那么答案当然是. 我将忽略您的情况的任何复杂性,并假设您想调用sin,cos或之一tan

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

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

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

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

于 2013-01-11T15:04:18.353 回答