Ошибка компилятора интерфейса 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.
Также я бы порекомендовал вам использовать модуль для ваших функций. У вас есть только одно место, чтобы изменить.