g95 против gfortran: фиктивная процедура 'f' процедуры PURE в (1) также должна быть PURE
....
abstract interface
pure function fi(t,u) result (fu)
use NumberKinds
real(kp), dimension(:), intent(in) :: u
real(kp), intent(in) :: t
real(kp), dimension(size(u)) :: fu
end function fi
end interface
contains
pure function rk4_step(u,f,dt) result(un)
use NumberKinds
real(kp), intent(in) :: dt
real(kp), intent(in), dimension(:) :: u
real(kp), dimension(size(u)) :: k1,k2,k3,k4,un
procedure(fi) :: f
integer :: N
...
end function rk4_step
...
Я получаю это сообщение об ошибке с g95: G95 (GCC 4.0.3 (g95 0.94!) 17 января 2013 г.)
In file src/integrators.f95:34
pure function rk4_step(u,f,dt) result(un)
1
Error: Dummy procedure 'f' of PURE procedure at (1) must also be PURE
Makefile:28: recipe for target 'test_rk4' failed
Я не получаю это с gfortran: GNU Fortran (GCC) 4.8.2 20140206 (предварительная версия) и программа компилируется без дальнейших проблем
1 ответ
Решение
Просто ошибка компилятора. g95 очень старый, когда Fortran 2003 только начал внедряться в компиляторы. Он имеет приличное C-взаимодействие, доступ к потоку и так далее, но многие другие функции вообще не реализованы.
Не используйте компилятор, который не обновлялся долгое время (за небольшим исключением в последнее время), если вам нужна поддержка современных функций.
Вы можете попробовать интерфейсный блок внутри rk4_step
вместо abstract interface
это Fortran 90 и у меня работает в g95.
pure function rk4_step(u,f,dt) result(un)
use NumberKinds
real(kp), intent(in) :: dt
real(kp), intent(in), dimension(:) :: u
real(kp), dimension(size(u)) :: k1,k2,k3,k4,un
integer :: N
interface
pure function f(t,u) result (fu)
use NumberKinds
real(kp), dimension(:), intent(in) :: u
real(kp), intent(in) :: t
real(kp), dimension(size(u)) :: fu
end function f
end interface
end function rk4_step