我在理解爲什麼在子例程中聲明的變量(i
)在包含的子例程中可見,但這對於函數(fie
)編譯錯誤。我搜索了一個答案,並試圖查看是否可以在Fortran 95標準中找到某些東西,但徒勞無功。所包含子例程中變量和函數的作用域規則
我寫了一個小例子程序:
program pgm
call a
end
subroutine a
implicit none
integer :: i
double precision :: fie
i = 7
call b
!write(*,*) fie(9)
contains
subroutine b
double precision :: x
!double precision :: fie
x = i
x = x + fie(i)
write(*,*) x
end subroutine
end subroutine
double precision function fie(ii)
implicit none
integer, intent(in) :: ii
fie = ii
end function
當在cygwin下與gfortran編譯此(gfortran 5.4.0)我得到以下錯誤消息:
$ gfortran aa.f90
aa.f90:20:15:
x = x + fie(i)
1
Error: ‘fie’ at (1) is not a function
當啓用的任一程序編譯並正確運行的註釋行。
使用英特爾編譯器時(英特爾Fortran 12.1.7.367,確實很舊),我看到類似的錯誤消息。
它看起來像fie
必須在包含的例程中可用或必須在包含子例程中使用,但正如所說我無法在網絡或Fortran 95標準中找到答案(或者我可能沒有找到合適的詞)。
任何解釋?
我知道使用模塊會更好,但它是現有代碼庫的一部分,其中部分擴展(由其他人使用)。 – albert