ошибка при определении функции внутри другой функции в фортране - PullRequest
0 голосов
/ 02 апреля 2020

Для некоторого использования мне нужно определить функцию внутри другой функции внутри модуля fortran. Пример кода для легкого понимания:

module func
implicit none
contains

real function f(x,y)
real x,y,g

real function g(r)
real r
g=r
end function g

f=x*g(y)
end function f
end module func

use func
implicit none

write(*,*) f(1.0,1.0)
end

Это дает множество ошибок в gfortran, таких как неожиданное объявление данных, ожидаемая конечная функция f, а не g .... et c.

Как правильно определить функцию внутри другой функции в фортране?

1 Ответ

3 голосов
/ 02 апреля 2020

Вы используете внутреннюю подпрограмму, см. Ниже. Обратите внимание, что сами внутренние подпрограммы не могут содержать внутренние подпрограммы.

ian@eris:~/work/stack$ cat contained.f90
Module func

  Implicit None

Contains

  Real Function f(x,y)

    ! Interface explicit so don't need to declare g
    Real x,y

    f=x*g(y)

  Contains

    Real Function g(r)
      Real r
      g=r
    End Function g

  End Function f

End Module func

Program testit

  Use func

  Implicit None

  Write(*,*) f(1.0,1.0)

End Program testit
ian@eris:~/work/stack$ gfortran-8 -std=f2008 -Wall -Wextra -fcheck=all -O -g contained.f90 
ian@eris:~/work/stack$ ./a.out
   1.00000000    
ian@eris:~/work/stack$ 
...