Вызов функции из модуля

#linux #fortran

#linux #fortran

Вопрос:

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

это то, что я делаю, чтобы скомпилировать ее с помощью 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
  

Комментарии:

1. call предназначен для подпрограмм, а не для функций.

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

3. Однако рекурсивный ввод-вывод может быть проблематичным, @HighPerformanceMark. Так что, возможно n=double(n) .

4. Ах да, это так. Давайте посмотрим, что сообщает OP!

5. Почему вы пишете правильные ответы в комментарии? OP не может принять комментарий как правильный.

Ответ №1:

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

 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 to double приведет к значению n to double.

ИЛИ вы можете изменить способ вызова double :

 program testMod
    use doubleMod
    implicit none
    integer :: n
    n = 3
    n = double(n)
    print*, n      ! prints 6
end program testMod