Я подумал, что спецификация массива фиктивных аргументов в форме подпрограммы может включать любые целочисленные переменные, включая другие фиктивные переменные (обычные случаи), модульные переменные и локальные переменные текущей подпрограммы. Но оказывается, что локальные переменные (которые не являются фиктивными) не могут использоваться в спецификации.
Пример выглядит следующим образом:
module mp
implicit none
contains
subroutine p(b)
integer :: m=4, n=4 !not integer,parameter :: m=4, n=4
integer :: b(m,n)
end subroutine p
end module mp
Гфортран повысит Error: Variable 'm' cannot appear in the expression at (1)
В этом примере я могу использовать integer,parameter :: m=4, n=4
, чтобы избежать этого, но я не понимаю, почему исходный случай не работает, учитывая тот факт, что границы / экстенты массивов явных форм не нужно знать при компиляции время. Работает модифицированная версия приведенного выше примера:
module mp
implicit none
integer :: m=4, n=4
contains
subroutine p(b)
integer :: b(m,n)
end subroutine p
end module mp
Учитывая небольшую разницу между двумя примерами, я ожидаю, что оба они сработают, но на самом деле первый не сработает. Может ли кто-нибудь объяснить причину?
Обновление: я обнаружил, что это очень тонкая проблема, потому что она зависит от того, содержится ли подпрограмма в модуле или является автономной, она также зависит от версии gfortran. Я разместил примеры в области ответов.