【问题标题】:How to execute a subroutine whose name is just known in runtime, in Fortran 90?如何在 Fortran 90 中执行名称在运行时已知的子例程?
【发布时间】:2013-01-11 13:39:33
【问题描述】:

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

程序 subroutine_name

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

【问题讨论】:

    标签: command-line-arguments fortran90 subroutine


    【解决方案1】:

    真的没有办法编写 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
    

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

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

    【讨论】:

    • 嗨,谢谢你的回答,我明白你的意思了。对于内在功能,我完全清楚,因为我知道所有这些功能,因此可以使用选择案例根据用户输入做出选择,如您的示例所示。但在我的情况下,用户编写了一个自定义程序并将其与我的程序一起编译。然后我想知道用户是否可以为此例程选择任何名称并将此名称作为参数传递给我(例如在文件上)。正如你所回答的,这是不可能的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多