Передача строк для выполнения в подпрограммах 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) модификатор.

Другие вопросы по тегам