1

最初のサブルーチン (CALCONE) 内に配列を作成するプログラムを以下に示します。それを次のサブルーチン (CALCTWO) に渡し、メイン プログラムのファイルに出力します。配列を IN サブルーチン CALCONE に割り当てる必要があるため、INTENT(IN)、INTENT(OUT) ステートメントをどこに配置すればよいかわかりません (私のプログラムでは、長さは CALCONE で決定されるため) - 回避する試みを省略しました錯乱。誰かがそれらを正しい場所に置くのを手伝ってくれませんか。テンプレートができたら、それが将来どのように機能するかを理解します。ありがとう。

私はプログラムを単純化し、変数は移動できない他のものを表しています。サブルーチン間で配列を移動し、メイン プログラムの最後に書き出す方法が必要なだけです。

 program TEST
 implicit none

 integer a,b,c,d,reclen

 a = 1
 b = 2
 c = 3
 d = 4

 call CALCONE(a,b,c,d,array)

 call CALCTWO(e,f,g,h,array)

 inquire(iolength=reclen)array 
 open(unit=8,file='array_output.dat', &
   form="unformatted",access="stream")
 write(unit=8)array       
 close(unit=8)

 END PROGRAM TEST

 SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
 IMPLICIT NONE

 integer i,j,k
 integer e,f,g,h,N
 !ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
 real*8,   allocatable  :: arraydummy(:,:)

 e = a + 1
 f = b + 1
 g = c + 1
 h = d + 1

 ! N can only be is calculated here

 allocate(arraydummy(1:N,1:3))

 !POPULATE 'arraydummy'
 !PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
 END SUBROUTINE CALCTWO

 SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
 IMPLICIT NONE

 integer e,f,g,h
 !DEFINE HERE ALSO? i.e.
 !real*8,   allocatable  :: arraydummy(:,:)

 e = a + 1
 f = b + 1
 g = c + 1
 h = d + 1

 arraydummy = arraydummy*e*f*g*h

 END SUBROUTINE CALCTWO
4

1 に答える 1

6

メインプログラムで配列を割り当てる必要はありませんが、必ずそこで宣言する必要があり、引数として渡す必要があります(これを行います)。シンボルarrayがメインプログラムで定義されていないことに注意してください。

潜水艦への明示的なインターフェースを必ず提供してください。高度な機能(割り当て可能なダミー引数)を使用するため、これが必要です。それらをモジュールに入れるのが最善です。

配列は、両方でダミー引数として定義する必要があります。最初に割り当てられているので、最初のものでintent(out)として宣言しました。厳密には必要ありません。

もう1つのオプションは、モジュールで配列を宣言し、モジュールプロシージャで共有できるようにすることです。

免責事項:私はそれをコンパイルしようとしませんでした。

 module subs
   integer,parameter :: rp = kind(1d0)


   contains




   SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
   IMPLICIT NONE

   integer i,j,k
   integer e,f,g,h,N
   !ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
   real(rp),   allocatable, intent(out) :: arraydummy(:,:)

   e = a + 1
   f = b + 1
   g = c + 1
   h = d + 1

   !N can only be is calculated here

    allocate(arraydummy(1:N,1:3))

   !POPULATE 'arraydummy'
   !PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
   END SUBROUTINE CALCTWO

   SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
   IMPLICIT NONE

   integer e,f,g,h
   !DEFINE HERE ALSO? i.e.
   real(rp),   allocatable, intent(inout)  :: arraydummy(:,:)

   e = a + 1
   f = b + 1
   g = c + 1
   h = d + 1

   arraydummy = arraydummy*e*f*g*h

   END SUBROUTINE CALCTWO


 end module subs

 program TEST

 use subs

 implicit none

 integer a,b,c,d,reclen

 real(rp),allocatable :: array

 a = 1
 b = 2
 c = 3
 d = 4

 call CALCONE(a,b,c,d,array)

 call CALCTWO(e,f,g,h,array)

 inquire(iolength=reclen)array 
 open(unit=8,file='array_output.dat', &
   form="unformatted",access="stream")
 write(unit=8)array       
 close(unit=8)

 END PROGRAM TEST
于 2012-12-21T17:54:30.577 に答える