Fortran の共通ブロックはグローバル変数の目的を果たしますか?
この場合、これらの値をサブルーチンで変更できますか?
SAVE
サブルーチン内以外で使用するために、サブルーチン内から変更されたパラメーターを保存しますか?
Fortran の共通ブロックはグローバル変数の目的を果たしますか?
この場合、これらの値をサブルーチンで変更できますか?
SAVE
サブルーチン内以外で使用するために、サブルーチン内から変更されたパラメーターを保存しますか?
[編集:私は、質問がSAVE
ローカル変数ではなく、共通ブロックに関するものであることを理解することに基づいて答えています(つまり、の代替としてCOMMON
)。それ以外の場合は、カップのコメントを参照してください。]
共通ブロックは実際、Fortran 77 の「グローバル」変数に対するアプローチでした。ブロック内の変数はサブルーチンで変更でき、変更は別の場所で表示されます (警告を参照)。
SAVE
変更された変数を使用する他のサブプログラムの機能を直接変更することはありません。代わりに、その目的は、ブロックがスコープ外になったときにブロック内のデータが未定義にならないようにすることです。が 1 つのサブプログラムに存在する場合、ブロックが機能するすべてのサブプログラムのブロックに存在する必要があることに注意してくださいSAVE
(ただし、必ずしもメインプログラムであるとは限りません)。
メモリから、これは次のことを意味します (これは実際には F77 ではありません; 概念のため):
call s1
call s2
end
subroutine s1
common /bl/ i,j
i=2
end subroutine s1
subroutine s2
common /b1/ i,j
print *, i
end subroutine s2
行儀がよくないでしょう。[実際のコンパイラがあなたにお金を払わせるかどうかは議論の余地があります.]
共通ブロック内の変数にSAVE
属性を個別に適用することはできず、ローカル変数に属性を設定してもアクセシビリティは変わりません。したがって、たとえば、あるSAVE K
サブルーチンで a を実行しても、その変数は他の場所ではアクセスできません。ただし、そこから制御が戻った後も (次にサブルーチンに入るまで) その値が保持されます。
最後に、Fortran 77 以降にはより良いアプローチがあります。
はい、common
グローバル変数を作成します。Fortran >=90 では、その目的のためにモジュール変数が提供されています。モジュール変数は、共通変数よりも新しいコードで使用する必要があります。common は、一般に不必要なストレージ順序の複雑さを追加します。共通変数またはモジュール変数は、複数のプロシージャ サブルーチンと関数) およびメイン プログラムで使用できます。
save
主にプロシージャ内のローカル変数用であり、それらの変数が呼び出し間で値を保持するようにします。 fortran SAVE ステートメント
save
モジュール変数に適用することもできます。これにより、モジュールを使用するルーチンがスコープ内にない場合でも値が失われないことが保証されます。これは Fortran 2008 では不要になりました -- Fortran 90/95 でモジュールがスコープ外になるのはいつですか? を参照してください。