2016-06-21 12 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 

エラー:定数でなければなりません(1)で変数 'JJ' は、この文脈で

Iもし誰かがこれをやる方法を手伝ってもらえると本当に感謝しています。

+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では、モジュール内のopenおよびread文は使用できません。 – emperial

+0

それは本当ではありません! Open文とRead文は、すべてがモジュール内に囲まれたサブルーチン内で使用できます。私は、サブルーチン間でグローバル変数を共有する必要性を排除する派生データ型内に配列を配置することをお勧めします。 – jlokimlin

関連する問題