Передача строк для выполнения в подпрограммах Fortran
В следующей подпрограмме я хотел бы передать строковые переменные с именем 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
2 ответа
Ты не можешь не легко. Есть две вещи, которые вы можете сделать, хотя:
Во-первых, вы можете использовать указатели на функции. Вот простой пример на http://www.macresearch.org/advanced_fortran_90_callbacks_with_the_transfer_function - идея в том, что вы можете передать имя функции, определенной в другом месте. этого может быть достаточно, чтобы решить вашу проблему.
Вы можете вызвать библиотеку, которая анализирует строку и оценивает выражение. Я ничего не знаю о Фортране, но ваш компилятор Фортрана может поддерживать вызов процедур c. для gfortran (и, возможно, для других) это выглядит так, как будто это будет работать - http://www.gnu.org/s/libmatheval/ (пример кода fortran на http://www.gnu.org/s/libmatheval/manual/libmatheval.html)
На самом деле, это действительно просто
subroutine f(fval, i, t, str)
...
character(len=*), intent(in) :: str
...
end subroutine
Хитрость заключается в том, чтобы определить аргумент фиктивной строки как "неизвестной длины", НО с intent(in)
модификатор.