Передача строк для выполнения в подпрограммах Fortran - PullRequest
2 голосов
/ 07 сентября 2011

В следующей подпрограмме я хотел бы передать строковые переменные с именем 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 ]

2 голосов
/ 07 сентября 2011

ты не можешь.не легко.однако вы можете сделать две вещи:

  • сначала вы можете использовать указатели на функции.есть простой пример на 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#Fortran-sample-program)

0 голосов
/ 08 июля 2015

На самом деле, это действительно просто

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

Хитрость заключается в определении аргумента фиктивной строки как «неизвестной длины», НО с модификатором intent(in).

...