Почему GCC не предупреждает меня, когда я забываю указать тип возврата функции интерфейса? Для меня это поведение кажется неожиданным. Что вы на это скажете?Ошибка компилятора интерфейса Fortran 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
Результат таков:
[email protected]:/media/disk> gfortran44 -Wall return-test.f90
[email protected]:/media/disk> ./a.out
Y= 5.1515149999999998
return Y/2 2.5757574999999999
result= -1.0579199790954590
[email protected]:/media/disk> ifort return-test.f90
[email protected]:/media/disk> ./a.out
Y= 5.15151500000000
return Y/2 2.57575750000000
result= 2.57575750350952
Вы правы с отдельной областью. Разве компиляторы не отказываются компилировать его (и мои недавние) еще одну ошибку? Они жалуются, что интерфейсный блок не согласен с фактическим определением. Компиляторы не должны вызывать ошибку в соответствующей программе, только предупреждение, которое я думаю. Я не уверен, какой стандарт говорит в этой ситуации, потому что функция должна быть отдельной единицей компиляции, будучи в том же файле или нет. –
@VladimirF: Некоторые (большинство?) Компиляторов по умолчанию не находятся в строгом режиме. Вы должны использовать флаг, чтобы явным образом сказать им, чтобы они не допускали такие вещи, как расширения или определенные несоответствующие программы. – eriktous
Конечно, но я не уверен, если они не являются oposite случае, если я правильно понимаю проблему. –