1

gfortran 4.1.2 と gfortran 4.8.0 を使用して、次の単純なコードをコンパイルします。

function foo(a, b) result(res)

    integer, intent(in) :: a, b
    integer res

    res = a+b

end function foo

program test

    integer a, b, c

    c = foo(a, b)

end program test

gfortran 4.1.2 は成功しますが、gfortran 4.8.0 では奇妙なエラーが発生します。

test.F90:14.11:

    c = foo(a, b)
           1
Error: Return type mismatch of function 'foo' at (1) (REAL(4)/INTEGER(4))

何か案が?

4

1 に答える 1

0

コードにバグがあります。つまり、メイン プログラムで関数 foo の戻り値の型を指定していません。したがって、Fortran の暗黙的な型付け規則に従って、デフォルトの実数型が取得されます。

(1) 常に「implicit none」を使用する必要があります。さらに、可能であれば、(2) モジュールまたは含まれるプロシージャを使用して、明示的なインターフェイスを提供する必要があります。

GFortran 4.1 がこのエラーを報告しない理由は、古いバージョンの GFortran が常に「一度に処理」モードで機能していたためです。したがって、コンパイラは同じファイル内の他の関数を喜んで認識しません。新しいバージョンは「ファイル全体」モード (4.6 以降のデフォルト) で動作し、コンパイラは一度にファイル内のすべてのプロシージャを「参照」します。これにより、コンパイラはコード内のエラーなどをキャッチできるようになり、最適化の機会も提供されます。

于 2013-05-09T06:05:24.180 に答える