私はFortran初心者です。私はメインプログラムから4つの引数を取るサブルーチンを書こうとしています。そして、最初に渡された4つの引数を含む配列をメインプログラムに出力します。これを行うには何が良い方法ですか?Fortran 90で引数を渡すスマートな方法
は例えば、以下の私のテストプログラムでは、私は、メインプログラムの4つの実数変数を(a
、b
、c
、およびd
)を作成します。次に、これらの実変数をmysub
というサブルーチンに渡します。 mysub
をa
、b
、c
、およびd
に入れて、o
という2行2列の配列を作成し、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
しかし、私は次のエラーを取得する:o
はしていないので、
test.f90:10.53:
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: o
1
Error: Symbol at (1) is not a DUMMY variable
私はこれを解釈し、コンパイラは、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
を割り当てる世話をする必要があることを意味していることだと思うので、これは、潜在的に混乱を招くようです。サブルーチンからメインプログラムに配列を送るには、よりスマートな方法がありますか?あなたの時間をありがとう。あなたは、配列を返すようにしたい場合は