2017-08-16 5 views
1

モジュール内で宣言された整数変数は、プログラム内の関連する配列のサイズを定義するグローバル変数として使用されます。プログラムのサイズは変わるので、配列のサイズは変数ですが、パラメータではありません。それはプログラムの始めに決定されます。モジュールまたはメインプログラム配列はFortranで一定の形状エラーを持つ必要があります

次のコードスニペットでは、nがグローバルサイズ変数です。それはモジュール内で宣言され、主関数/プログラムの始めに定義されます。メインプログラムにはnの同様の使い方があり、アレイを初期化するためのメインプログラムにはサブルーチンが含まれています。しかし、メインプログラムの場合の初期化では、エラー:モジュールまたはメインプログラム配列は一定の形状誤差を持たなければならないが、サブルーチンの初期化が機能する。異なる位置で使用される非定常値のこの異なる処理の背後にあるメカニズムは何ですか?

module mod 
    implicit none 
    integer :: n 
end module mod 



program main 
    use mod 
    implicit none 
    integer :: b(n) 
    n = 5 
    b(:) = 1 
    print*, b(:) 

    call sub 

contains 

    subroutine sub 
    integer :: a(n) 
    a = 10 
    print*, a 
    end subroutine sub 

end program main 
+0

整数の宣言の瞬間にnの値は分かりません:: b(n)なので、integer、pointer:b(:); n = 5; allocate(b)または整数、パラメータ:: nn = 5;整数:: a(nn); n = nn – albert

答えて

1

アレイa(n)ように宣言は、明示形状配列です。 nが定数(名前付きまたはそれ以外は厳密には定数式)でない場合、そのような配列は自動オブジェクトです。

自動オブジェクトは、表示される場所が制限されています。具体的には、明示的形状配列は、以下の制約(F2008のC531)の対象である:モジュールmodからnとして

An explicit-shape-spec whose bounds are not constant expressions shall appear only in a subprogram, derived type definition, BLOCK construct, or interface body.

それはメインプログラムに配列の境界として使用することができない一定ではありません。サブルーチンsubはサブプログラムであるため、a(n)は非定数バインドの有効な使用方法です。

代わりにメインプログラムに自動オブジェクトを有することが、一つはその代わりのいずれかpointer又はallocatable属性を使用して、遅延形状配列を考慮することができます。

関連する問題