2016-10-19 5 views
0

Я пытаюсь сделать что-то реальное просто, просто вызовите функцию, которая определена в модуле, но не работает, и я не могу понять, почему.Вызов функции из модуля

это то, что я делаю, чтобы скомпилировать его с помощью Linux

gfortran -o testingMOD testMod.f90 doubleMod.f90 

это ошибка

testMod.f90:3.4: 

use doubleMod 
    1 
testMod.f90:8.15: 

call double(n) 
       2 
Error: 'double' at (1) has a type, which is not consistent with the CALL at (2) 

здесь код модуль:

module doubleMod 
implicit none 

contains 
function double (n) 
    implicit none 
    integer :: n, double 

    double = 2*n 
    write(*,*) double 
end function double 

end module doubleMod 

файл, вызывающий его:

program testMod 

use doubleMod 

implicit none 
integer :: n = 3 

call double(n) 

end program testMod 
+2

'call' для подпрограмм, а не функции. – francescalus

+0

Попробуйте заменить 'call double (n)' на 'write (*, *) double (n)' и посмотреть, что произойдет. –

+0

Рекурсивный ввод-вывод может быть проблематичным, однако, @HighPerformanceMark. Итак, возможно, «n = double (n)». – francescalus

ответ

1

Фортран имеет два основных типа процедур: Функции и Подпрограммы. Функции возвращают значение, поэтому они вызываются внутри выражения. Примеры:

a = myfunc(b) 
print*, myfunc(a) 

Подпрограммы не возвращают значение, они должны называться:

call mysub(a, b) 

Попытка call функцию или использовать подпрограмму в выражении является синтаксической ошибкой.

В вашем случае, вы можете либо конвертировать double в подпрограмму:

subroutine double(n) 
    implicit none 
    integer, intent(inout) :: n 
    n = 2 * n 
end subroutine double 

Тогда ваш call к double приведет к значению n удвоить.

ИЛИ вы можете изменить то, как вы вызываете double:

program testMod 
    use doubleMod 
    implicit none 
    integer :: n 
    n = 3 
    n = double(n) 
    print*, n  ! prints 6 
end program testMod 
Смежные вопросы