Функция не имеет неявного типа
Я пытаюсь научиться работать с функциями. У меня есть следующий код:
program main
implicit none
write(*,*) test(4)
end program
integer function test(n)
implicit none
integer, intent(in) :: n
integer :: i, ans
ans=1
do i=1,n
ans=ans*i
enddo
test=ans
end function test
Когда я компилирую (с gfortran 4.1.2), я получаю следующую ошибку:
In file test.f90:4
write(*,*) test(4)
1
Error: Function 'test' at (1) has no IMPLICIT type
Ответы
Ответ 1
Переместите строку
end program
в конец исходного файла и на его месте напишите строку
contains
Как вы написали свою программу, он не знает о функции test
, о чем говорит вам компилятор. Я предложил один из способов, которыми вы можете предоставить программе знания, в которых она нуждается, но есть и другие. Поскольку вы ученик, я оставлю вас, чтобы выяснить, что происходит подробно.
Ответ 2
На всякий случай, у кого-то есть такая же проблема, альтернативный способ (особенно для случая, обсуждаемого в комментарии) состоит в том, чтобы добавить
integer,external :: test
после
implicit none
в основной программе.
Ответ 3
Просто поставьте это:
program main
implicit none
целочисленный тест
write(*,*) test(4)
end program
...
Вам нужно объявить функцию как переменную для компилятора, чтобы узнать тип возвращаемой функции.
Ответ 4
Еще один простой способ, не упомянутый в текущих ответах:
Переместите функцию перед основной программой, поместите module subs
, implicit none
и contains
перед функцией и end module
после функции. Положите use subs
в вашу программу.
Таким образом, программа может видеть все необходимое ("явный интерфейс") о процедурах в модуле subs
и будет знать, как правильно их вызывать. Компилятор сможет выдавать предупреждения и сообщения об ошибках, если вы попытаетесь вызвать процедуры неправильно.
module subs
implicit none
contains
integer function test(n)
!implicit none no longer necessary here
end function test
end module
program main
use subs
implicit none
Ответ 5
Я получил одну и ту же ошибку несколько раз. Который хорошо себя зарекомендовал:
function foo()
integer::foo !declare function with any type
...
...
foo = some_calc_solution
end function foo