在下面的子例程中,我想传递一个名为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
答案 0 :(得分:2)
首先,您可以使用函数指针。在http://www.macresearch.org/advanced_fortran_90_callbacks_with_the_transfer_function有一个简单的例子 - 想法是你可以传递在别处定义的函数的名称。这可能足以解决您的问题。
您可以调用一个解析字符串并评估表达式的库。我不知道fortran中有什么,但你的fortran编译器可能支持调用c例程。对于gfortran(也许是其他人)来说,这看起来会起作用 - http://www.gnu.org/s/libmatheval/(例如http://www.gnu.org/s/libmatheval/manual/libmatheval.html#Fortran-sample-program上的fortran代码)
答案 1 :(得分:-4)
实际上,这很简单
subroutine f(fval, i, t, str)
...
character(len=*), intent(in) :: str
...
end subroutine
诀窍是使用intent(in)
修饰符定义“未知长度”BUT的虚拟字符串参数。