2016-06-21 3 views
0

배열 차원을 서브 루틴에 더미 변수로 전달하고 싶습니다. 배열 자체는 Common 블록에 있습니다. 이 코드입니다 :Fortran에서 일반 블록 배열 크기를 서브 루틴으로 전달

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

오류 : 변수 'JJ'에서 (1)이 문맥에서 일정

내가해야

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 

이 나는 ​​서브 루틴에서 얻을 오류입니다 아무도이 일을하는 방법을 도울 수 있다면 정말로 감사 할 것입니다.

+3

질문에 대한 의미있는 대답을 할 수 있지만라는 대답을 바라 보는 것 : 돈 ' 이 목적을 위해 공통 블록을 사용합니까? Fortran은 지난 30 년 동안 엄청난 움직임을 보였습니다. – francescalus

+0

Python과 MATLAB이있을 때 올바른 생각을 가진 사람이 Fortran을 사용해야한다고 생각하지 않습니다. 사람들이 지금 당장 다시 방문해야하는 오래된 코드가 있습니다. – emperial

답변

1

범위 문제가 있습니다. 읽기 : Scope in Fortran. 즉, 서브 루틴 estimate은 추가 인수로 전달해야하는 변수 Nt에 대한 액세스가 필요하거나 contains 문을 사용하여 프로그램 내 전체 서브 루틴을 이동할 수 있습니다. 이렇게하면 프로그램이 성공적으로 실행될 수 있지만 common 블록을 기권 해 주시기 바랍니다. 이 때문에 기존의 코드로 피할 수없는 경우 참조 : 대신 Improve your FORTRAN 77 programs using some Fortran 90 features

에 한번 사용 모듈 :

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

그건 사실이 아니야! Open 문과 Read 문은 모두 모듈 안에 모두 포함 된 서브 루틴 안에서 허용됩니다. 서브 루틴 사이에 전역 변수를 공유 할 필요가없는 파생 데이터 유형 내에 배열을 배치하는 것이 좋습니다. – jlokimlin

관련 문제