Функция не имеет неявного типа

Я пытаюсь научиться работать с функциями. У меня есть следующий код:

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