この構造例に従います、プログラム内から呼び出すこのようなものにする:
program hehe
implicit none
call test(10)
contains
subroutine test(n)
implicit none
.
.
.
end subroutine test
end program hehe
しかし、これはあなたの問題の終わりではありません:これは形状(10,10)を作成することになりますが配列u
と呼ばれ、値を入力すると、サブルーチンの終わりに達するとすぐに再びそれを忘れるでしょう。
あなたがu
を維持したい場合は、あなたがもう少し関与取得する必要があります:
program hehe
implicit none
integer, parameter :: n = 10
integer :: u(n, n)
call test(n, u)
contains
subroutine test(n, u)
implicit none
integer, intent(in) :: n
integer, intent(out) :: u(n, n)
< populate u >
end subroutine test
end program hehe
あなたはまだu
で何もしていないので、どのコンパイラが密かに不必要に捨てるということは可能ですu
の計算ですが、たとえば印刷する場合は、期待どおりの処理を行う必要があります。
また、機能を使用できます。
program hehe
implicit none
integer, parameter :: n = 10
integer :: u(n, n)
u = test(n)
contains
function test(n) result(v)
implicit none
integer, intent(in) :: n
integer :: v(n, n)
< populate v >
end function test
end program hehe
(私は2人の変数名が同じである必要はありませんことを示すための機能でv
を使用しましたtest(n)
は、2次元配列を返します、それを保存するものはあなた次第です)
完全性のために含めるオプションもありますが、使用しないことをお勧めします。手順(サブルーチンと関数の両方)は、 contains
セクションは、新しい変数がexpでない限り、プログラムの変数にアクセスできますそれは何かがうまくいかない場合は理解する混乱があるので、私はこれが好きではない
program hehe
implicit none
integer, parameter :: n = 10
integer :: u(n, n)
call test()
write(*, '(10I6)') u
contains
subroutine test()
implicit none
integer :: i, j ! n and u not declared here, taken from program.
u = reshape((/((100*i + j, i = 1, n), j = 1, n)/), (/n, n/))
end subroutine test
end program hehe
理由:これはあまりにも動作しますのでlicitly、同じ名前で宣言されました。ただちに「u
はどこに変わったのですか?あなたは基本的にどこでも見なければなりません。
あなたの投稿にエラーメッセージを追加してください。それはあなたが答えを得る機会を増やします(私は 'gfortran'を使用しませんが、他の人は助けることができます)。 –
'n'は10に初期化されません。10の定数に' integer、parameter :: n = 10'という宣言を追加します。 – ja72
また、静的配列(サイズは事前定義済み)を使用するかどうかを決定する必要があります。プログラムが実行されるときにサイズが決定される割り振り可能な配列。 – ja72