私は Fortran の初心者です。メイン プログラムから 4 つの引数を受け取り、最初に渡された 4 つの引数を含む配列をメイン プログラムに出力するサブルーチンを作成しようとしています。これを行う良い/スマートな方法は何ですか?
たとえば、以下のテスト プログラムでは、メイン プログラムで4 つの実数変数 ( a
、b
、c
、および) を作成します。d
次に、これらの実数変数を というサブルーチンに渡しますmysub
。、、、およびをmysub
取り込み、それらを使用して と呼ばれる 2 行 2 列の配列を設定し、メイン プログラムに送信してそこで表示 (および可能な変更) できるようにしたいと考えています。だから、私は次のことを試しました:a
b
c
d
o
o
SUBROUTINE mysub(w,x,y,z)
IMPLICIT NONE
REAL, INTENT(IN) :: w, x, y, z
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: o
ALLOCATE(o(2,2))
o(1,1)=w
o(1,2)=x
o(2,1)=y
o(2,2)=z
END SUBROUTINE mysub
END MODULE testsubs
PROGRAM test
USE testsubs
IMPLICIT NONE
REAL :: a=1.1, b=2.2, c=3.3, d=4.4
CALL mysub(a, b, c, d)
PRINT *, o(1,1), o(1,2)
PRINT *, o(2,1), o(2,2)
END PROGRAM test
しかし、次のエラーが表示されます。
test.f90:10.53:
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: o
1
Error: Symbol at (1) is not a DUMMY variable
私はこれを、サブルーチンヘッダーの引数のリストにないo
ため、コンパイラーが何であるかを知らないと解釈します: . したがって、おそらくそのヘッダーに含める必要があります。そこで、次に次のことを試します (ここでは、 を使用して変更または追加を示しています)。o
SUBROUTINE mysub(w,x,y,z)
o
!...
SUBROUTINE mysub(w,x,y,z,o) !...
IMPLICIT NONE
REAL, INTENT(IN) :: w, x, y, z
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: o
ALLOCATE(o(2,2))
o(1,1)=w
o(1,2)=x
o(2,1)=y
o(2,2)=z
END SUBROUTINE mysub
END MODULE testsubs
PROGRAM test
USE testsubs
IMPLICIT NONE
REAL :: a=1.1, b=2.2, c=3.3, d=4.4
REAL, DIMENSION(:,:), ALLOCATABLE :: o !...
CALL mysub(a, b, c, d, o) !...
PRINT *, o(1,1), o(1,2)
PRINT *, o(2,1), o(2,2)
DEALLOCATE(o) !...
END PROGRAM test
これはうまくいくようで、正しい出力が得られます。
1.1000000 2.2000000
3.3000000 4.4000001
しかし、私の質問は、これはこれを行う良い方法ですか? この作業例では、サブルーチンとメイン プログラムのo
両方で配列を宣言しています。これは、サブルーチンまたはメインプログラムのいずれかが割り当てられるように注意する必要があることを意味するため、混乱を招く可能性があるようです(ただし、エラーメッセージを回避するために、両方ではないと思います)。サブルーチンからメイン プログラムに配列を送信する、よりスマートな方法はありますか? お時間をいただきありがとうございます。o