В статье Ошибки в Fortran 90 программ, которые могут вас удивить
Существует следующий раздел:
Опасность вызова подпрограмм стиля Fortran 90
program main real, dimension(5) :: x x = 0. ! THIS IS WRONG call incb(x) print *, x end program main subroutine incb(a) ! this is a fortran90 style subroutine real, dimension(:) :: a a = a + 1. end subroutine incb
Объяснение Подпрограмма incb использует принятую форму стиля Fortran 90 array (содержащий размерность (:)). Такие процедуры должны либо находиться в модулем или иметь явный интерфейс там, где они используются. В этом Например, никто не был прав.
Одним из правильных способов вызова таких процедур является использование явного интерфейс следующим образом:
program main real, dimension(5) :: x ! THIS IS THE RIGHT WAY interface subroutine incb(a) real, dimension(:) :: a end subroutine incb end interface x = 0. call incb(x) print *, x end program main subroutine incb(a) ! this is a fortran90 style subroutine real, dimension(:) :: a a = a + 1. end subroutine incb
Если подпрограмма в интерфейсе модуля генерируется автоматически и не нужно явно писать.
! THIS IS ANOTHER RIGHT WAY module inc contains subroutine incb(a) ! this is a fortran90 style subroutine real, dimension(:) :: a a = a + 1. end subroutine incb end module inc program main use inc real, dimension(5) :: x x = 0. call incb(x) print *, x end program main
Если используются интерфейсы, интерфейс ДОЛЖЕН соответствовать фактической функции.
Итак, продолжая мой вопрос, есть ли опция в gfortran
или других компиляторах для предотвращения компиляции, если есть вызов процедуры, интерфейс которой не определен явно (или определен в модуле)?
Если нет, не должна ли это быть функцией?