【问题标题】:Function has no implicit type函数没有隐式类型
【发布时间】:2021-11-12 14:11:25
【问题描述】:

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

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

【问题讨论】:

    标签: fortran


    【解决方案1】:

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

    将函数移到主程序前,将module subsimplicit nonecontains放在函数前,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
    

    【讨论】:

      【解决方案2】:

      就这样吧:

      program main
        implicit none
      

      整数检验

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

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

      【讨论】:

        【解决方案3】:

        以防万一,有人遇到同样的问题,另一种方法(尤其是评论中讨论的情况)是添加

        integer,external :: test
        

        之后

        implicit none
        

        在主程序中。

        【讨论】:

        • 接受的答案要好得多,因为它提供了显式接口并允许检查参数类型。
        • 'better' ...好吧,对于初学者来说,这个解决方案在某种意义上更容易,因此也更好。它不需要关于模块或包含等概念的额外知识。当然,接受的答案更加优雅和节省。所以我完全同意在我的程序中我更喜欢它。但作为一个初学者,我总是对简单的解决方案心存感激,即使它们可能无法以最一般的方式解决问题。
        • 我不同意。您正在将初学者引导到他们可能会被 20 年前出于充分理由被抛弃的旧风格所困的区域。当我在我们大学教授 Fortran 编程时,程序组织和模块是最重要的事情之一。在引入模块作为放置它们的容器之前,我不会展示如何编写子例程。
        • 抱歉来晚了……使用external 有效地禁用了编译器检查过程调用是否正确匹配实际和虚拟参数的能力。明确且客观地说,“更好”意味着程序员更难编写不安全甚至完全错误的代码。
        • ...我不明白为什么人们对正确答案投反对票!
        【解决方案4】:

        移动线

        end program
        

        到源文件的末尾,并在其位置写入该行

        contains
        

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

        【讨论】:

        • 好的,有什么方法可以把这个函数写在另一个文件中,以便在其他程序中重复使用?
        • 是的,正如我所写的,还有其他。您可以在另一个源文件中编写 module 并以这种方式重新使用该函数。请参阅您的 Fortran 教程。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2021-08-09
        • 2016-03-26
        • 1970-01-01
        相关资源
        最近更新 更多