#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