Fortran 函数没有隐式类型

Fortran 函数没有隐式类型,fortran,fortran90,Fortran,Fortran90,我正在努力学习使用函数。我有以下代码: 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 当我编译(使用

我正在努力学习使用函数。我有以下代码:

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
移动线路

end program
到源文件的末尾,并在其相应位置写入行

contains

当您编写程序时,它不知道函数
test
,这是编译器告诉您的。我已经提出了一种方法,可以让你为这个项目提供它所需要的知识,但是还有其他的方法。由于您是一名学习者,我将让您详细了解发生了什么。

以防万一,有人也有同样的问题。另一种方法(特别是对于评论中讨论的案例)是添加

integer,external :: test
之后

在主程序中。

只需输入以下内容:

program main
  implicit none
整数测试

  write(*,*) test(4)
end program
...

您需要将函数声明为变量,以便编译器知道函数的返回类型。

另一种简单的方法,当前答案中未提及:

将函数移到主程序之前,将
模块子模块
隐式无
包含
放在函数之前,将
结束模块
放在函数之后。将
使用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

好的,那么有什么方法可以把这个函数写到另一个文件中,以便在其他程序中重复使用呢?是的,正如我写的,还有其他的。您可以在另一个源文件中编写
模块
,并以这种方式重新使用该函数。请参阅您的Fortran教程。接受的答案要好得多,因为它提供了显式接口并允许检查参数类型。“更好”。。。嗯,对于初学者来说,这个解决方案更简单,因此在某种意义上也更好。它不需要关于模块或包含等概念的额外知识。当然,公认的答案更优雅、更节省。因此,我完全同意我更喜欢它作为我的节目。但是作为一个初学者,我总是很感激简单的解决方案,即使它们可能不能以最一般的方式解决问题。我不同意。您正在引导初学者进入一个区域,在那里他们可能会被20年前出于正当理由放弃的旧式风格所束缚。当我在我们大学教授Fortran编程时,程序组织和模块是最重要的事情之一。在引入模块作为容器将其放置在何处之前,我不会演示如何编写子例程。。。使用
external
有效地禁用了编译器检查过程调用是否正确匹配实际参数和伪参数的能力。明确地、客观地说,“更好”,就是让程序员更难编写不安全的、甚至完全错误的代码。。。。我不明白为什么人们会否决正确的答案!
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