1

インターフェイス関数の戻り型を指定し忘れたときにGCCが警告しないのはなぜですか?私にとって、この振る舞いは予想外の継ぎ目です。あなたはこれに何と言いますか?

これはテストプログラムです(6行目は正しくなく、正常に動作します)。

program returntest
implicit none
    interface
    function givehalf(Y)
      double precision :: Y
      !double precision :: givehalf !<-- Uncomment this line
    end function givehalf
    end interface
    double precision :: temp

temp=givehalf(5.151515d0)
print*, 'result=   ',temp

end program returntest

function givehalf(Y)
    implicit none
    double precision :: Y
    double precision :: givehalf

    print*, 'Y=        ',Y
    givehalf=Y/2.0d0
    print*, 'return Y/2',givehalf

    return
end function givehalf

結果は次のとおりです。

user@bapf028dl:/media/disk> gfortran44 -Wall return-test.f90
user@bapf028dl:/media/disk> ./a.out
  Y=           5.1515149999999998     
  return Y/2   2.5757574999999999     
  result=     -1.0579199790954590     
user@bapf028dl:/media/disk> ifort return-test.f90
user@bapf028dl:/media/disk> ./a.out 
  Y=           5.15151500000000     
  return Y/2   2.57575750000000     
  result=      2.57575750350952 
4

2 に答える 2

2

編集:それは本当にバグです。gfortran4.6および4.7でタイプエラーが発生します。

また、関数にモジュールを使用することをお勧めします。変更する場所は1つだけです。

于 2012-04-19T15:32:11.637 に答える
1

これはバグではありません。implicit noneインターフェイスブロック内のインターフェイス本体は別のスコープを形成するため、このようなエラーが発生しないように、そこにステートメントを含める必要があります。これがないと、暗黙の入力規則が有効になるため、関数はを返すことが期待されrealます。

interface
    function givehalf(Y)
        implicit none                 !<-- now you should get an error during compilation
        double precision :: Y
        !double precision :: givehalf !<-- Uncomment this line
    end function givehalf
end interface
于 2012-04-19T17:52:12.937 に答える