Ошибка компилятора интерфейса Fortran GCC?

Почему GCC не предупреждает меня, когда я забываю указать тип возврата интерфейсной функции? Для меня такое поведение кажется неожиданным. Что вы скажете на это?

Это тестовая программа (uncoment Line 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 

2 ответа

Решение

Это не ошибка. Тело интерфейса внутри интерфейсного блока образует отдельную область видимости, поэтому вы должны включить 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

Редактировать: это действительно ошибка. Это дает ошибку типа в gfortran 4.6 и 4.7.

Также я бы порекомендовал вам использовать модуль для ваших функций. У вас есть только одно место, чтобы изменить.

Другие вопросы по тегам