2011-09-06 18 views
2

在下面的子例程中,我想传递一个名为str的字符串变量。如果它是'poly','gaus','slat',则它具有预定义的动作(fval =见代码以下)。我想让用户指定一个函数来使用并将其作为字符串变量传递。在Fortran子程序中传递字符串以执行

也就是说......

如果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 

回答

2

你不能。不容易。有两件事你可以做,虽然:

+0

我会建议使用Lua,它很容易在Fortran应用程序中编译并可用于评估字符串。也许https://bitbucket.org/haraldkl/aotus/overview可能会给你一个想法如何做到这一点。 – haraldkl

+0

我不认为选项一会工作。这就是问题所在的“定义其他地方”。我希望这适用于任何函数作为字符串输入。至于你的第二选择 - 我认为这可能正是我所期待的! – drjrm3

-4

其实,这是很简单

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

关键是要界定“未知长度”的虚拟字符串参数,但带有intent(in)修饰符。

+3

我认为对这个问题的密切关注会表明这不是一个答案。该问题需要解决解析包含数学表达式的字符串的问题。 –