2016-06-21 104 views
0

我想將數組維度作爲虛擬變量傳遞給子例程。數組本身位於Common塊中。這是代碼:將常用塊數組大小傳遞給Fortran中的子例程

PROGRAM test 
integer i, nn 
integer PARAMETER(Nt=10) 
real x(Nt), y(nt), z(Nt) 
Common /Bdat/ z 
nn=Nt 
do i=1,Nt 
x(i)=i+1 
z(i)=i-1 
enddo 
call estimate(x,y,nn) 
print*, y 
return 
end 

subroutine estimate(x,y,jj) 
integer i,jj 
real x(jj), y(jj), zq(jj) 
COMMON /Bdat/ zq 
do i=1, jj 
y(i)=x(i)+zq(i) 
enddo 
return 
end 

這是我從子程序得到錯誤:

real x(jj), y(jj), zq(jj) 
         1 

錯誤:變量 'JJ' 在(1)在這種情況下必須是恆定

我如果有人能夠幫助如何做到這一點,我會非常感激。

+3

它可以給出一個有意義的問題的答案,但你會考慮一個答案,說:不要」爲此使用通用塊?在過去的30年裏,Fortran已經發生了很大的變化。 – francescalus

+0

我不認爲任何有正確思想的人都應該在Python和MATLAB出現時使用Fortran。有一些舊的代碼,人們必須不時重新訪問。 – emperial

回答

1

您有範圍問題。閱讀:Scope in Fortran。也就是說,您的子程序estimate需要訪問您需要作爲附加參數傳遞的變量Nt,或者您可以使用contains語句在程序中移動整個子程序。這會讓你的程序成功運行,但我強烈建議你不要使用common塊。如果你無法將它們避免因傳統的代碼看:Improve your FORTRAN 77 programs using some Fortran 90 features

使用try模塊改爲:

module bdat 

     implicit none 

     private 
     public :: NT, z 

     integer, parameter :: NT = 10 
     real    :: z(NT) 

    end module bdat 

    module my_sub 

     use bdat, only: & 
      zq => z ! You're free to rename the variable 

     implicit none 
     private 
     public :: estimate 

    contains 

     subroutine estimate(x,y) 
     ! calling arguments 
     real, intent (in) :: x(:) 
     real, intent (out) :: y(:) 

     ! local variables 
     integer :: i, jj 

     jj = size(x) 

     do i=1, jj 
      y(i)=x(i)+zq(i) 
     end do 

     end subroutine estimate 

    end module my_sub 

    program test 

     use bdat, only: & 
      NT, z 

     use my_sub, only: & 
      estimate 

     implicit none 

     integer :: i 
     real :: x(NT), y(NT) 

     do i=1,NT 
     x(i)=i+1 
     z(i)=i-1 
     end do 

     call estimate(x,y) 

     print *, y 

    end program test 
+0

如果必須從輸入文件中讀取x,y或z數組並使其可用於多個子例程,該怎麼辦? Fortran不允許在模塊中打開和讀取語句。 – emperial

+0

這是不正確的!子程序內部允許打開和讀取語句,所有語句都包含在模塊內部。我建議你將數組放在派生數據類型中,這樣就不需要在子例程之間共享全局變量。 – jlokimlin

相關問題