2016-11-19 11 views
1

サブルーチンで宣言された変数(i)が含まれているサブルーチンでなぜ表示されるのか理解できない問題があります。コンパイルエラー。私は答えを探して、Fortran 95標準で何かを見つけることができたのかどうかを試しましたが、無駄でした。含まれているサブルーチンの変数と関数のスコープ規則

program pgm 
    call a 
end 

subroutine a 
    implicit none 
    integer :: i 
    double precision :: fie 

    i = 7 
    call b 
    !write(*,*) fie(9) 

contains 
    subroutine b 
    double precision :: x 
    !double precision :: fie 

    x = i 
    x = x + fie(i) 
    write(*,*) x 
    end subroutine 
end subroutine 


double precision function fie(ii) 
    implicit none 
    integer, intent(in) :: ii 

    fie = ii 
end function 

cygwinの下のgfortranでこれをコンパイル(のgfortran 5.4.0)私は、次のエラーメッセージが出ます::のいずれかを有効にする場合

$ gfortran aa.f90 
aa.f90:20:15: 

    x = x + fie(i) 
       1 
Error: ‘fie’ at (1) is not a function 

は、私は小さなプログラム例を書きましたプログラムがコンパイルして正しく実行するコメント行。

インテルコンパイラ(インテルFortran 12.1.7.367、確かにかなり古いもの)を使用すると、同様のエラーメッセージが表示されました。

fieは、含まれているルーチンか、包括的なサブルーチンで使用する必要がありますが、netやFortran 95標準で答えが見つからない正しい言葉を求めていない)。

説明はありますか?これは手続きで、私はローカル変数を宣言していないです:

+0

モジュールを使用するほうがよいとわかっていますが、パーツが拡張されている既存のコードベースの一部です(他のものによって)。 – albert

答えて

2

最も簡単な修正は言う

double precision, external :: fie 

(もexternal文で指定することができます)外部属性を使用することです。

externalのない宣言を関数宣言として解釈するには、関数参照が関数本体内に存在していなければなりません。内部関数はカウントされません。したがって、コンパイラはfieという局所倍精度変数を作成しました。

感謝のIanHに関連する標準ルールのため(のFortran 2008(16.5.1.4p5)から、しかし、Fortran 95の同等になります):暗黙のインタフェースを備えた外部または仮手続がある場合

を はホストアソシエーションを介してアクセスされ、ホストスコープユニットにEXTERNAL 属性を持ちます。内部スコープユニット の関数として呼び出された場合、そのタイプとタイプのパラメータは、ホストスコープユニットで確立された でなければなりません。 のEXTERNAL属性を持つ関数の型と型のパラメータは、スコープ指定ユニットが明示的に宣言し、 関数を呼び出すか、モジュールから関数にアクセスするか、またはそのホストから関数 にアクセスすると、範囲指定の ユニットに設定されます。タイプとタイプのパラメータは です。

明示的なインターフェイス(モジュールを使用するのが最良)は、外部機能よりもはるかに優れています。

+0

私は 'external'可能性を忘れました。Fortran95標準では、" 14.6.1。3ホストアソシエーションは存在しますが、この点で私にはあまり明確ではありません。 – albert

関連する問題