【问题标题】:Passing strings for execution in Fortran subroutines传递字符串以在 Fortran 子例程中执行
【发布时间】:2011-11-11 17:07:11
【问题描述】:

在下面的子程序中,我想传递一个名为str 的字符串变量。如果是'poly'、'gaus'、'slat',那么它有一个预定义的操作(fval = 参见下面的代码)。我想让用户指定要使用的函数并将其作为字符串变量传递。

那是……

如果str = '3*cos(i*t)',那么我希望fval 等于3*cos(i*t)。如何让 Fortran 将输入的字符串解释为由 Fortran 执行的命令?

subroutine f(fval, i, t, str)
implicit none
integer, parameter :: ikind = selected_int_kind(8)
integer, parameter :: dbl = selected_real_kind(15,307)

integer(kind = ikind) :: i
real(kind = dbl) :: fval, t
character str*100

if(str .eq. 'poly') then
    fval = t**i
elseif(str .eq. 'slat') then
    fval = exp(-i*t)
elseif(str .eq. 'gaus') then
    fval = exp(-i*t*t)
else
    fval = ???
endif

end subroutine

【问题讨论】:

    标签: string fortran fortran90 subroutine


    【解决方案1】:

    你不能。不容易。不过,您可以做两件事:

    【讨论】:

    • 我建议使用 Lua,它很容易在您的 Fortran 应用程序中编译并可用于评估字符串。也许bitbucket.org/haraldkl/aotus/overview 可能会让你知道如何做到这一点。
    • 我认为选项一行不通。问题在于“在其他地方定义”。我希望这适用于作为字符串输入的任何函数。至于你的第二个选择——我想这可能正是我想要的!
    【解决方案2】:

    其实很简单

    subroutine f(fval, i, t, str) ... character(len=*), intent(in) :: str ... end subroutine

    诀窍是使用intent(in) 修饰符将虚拟字符串参数定义为“未知长度”。

    【讨论】:

    • 我认为更仔细地关注这个问题会表明这不是一个答案。该问题要求解决解析字符串以获取其包含的数学表达式的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多