2012-04-19 2 views
1

Почему 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 

ответ

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 
+0

Вы правы с отдельной областью. Разве компиляторы не отказываются компилировать его (и мои недавние) еще одну ошибку? Они жалуются, что интерфейсный блок не согласен с фактическим определением. Компиляторы не должны вызывать ошибку в соответствующей программе, только предупреждение, которое я думаю. Я не уверен, какой стандарт говорит в этой ситуации, потому что функция должна быть отдельной единицей компиляции, будучи в том же файле или нет. –

+0

@VladimirF: Некоторые (большинство?) Компиляторов по умолчанию не находятся в строгом режиме. Вы должны использовать флаг, чтобы явным образом сказать им, чтобы они не допускали такие вещи, как расширения или определенные несоответствующие программы. – eriktous

+0

Конечно, но я не уверен, если они не являются oposite случае, если я правильно понимаю проблему. –

2

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

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

+0

Благодарим вас за информацию. Я не смог проверить его на более поздних версиях gfortran. Теперь у меня есть еще одна причина, чтобы беспокоить моего администратора ;-) – AIFeuer

Смежные вопросы