如何声明在Fortran中返回数组的函数的类型?

bcf*_*bcf 4 fortran

我有一个返回数组的函数,比方说

function f(A)
    implicit none
    real, intent(in) :: A(5)
    real, intent(out) :: f(5)

    f = A+1
end
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何f在主程序单元中定义?例如

program main
    implicit none
    real :: A(5)
    real, dimension(5), external :: f  ! does not work

    ...
end 
Run Code Online (Sandbox Code Playgroud)

cas*_*sey 7

你需要一个明确的界面.你可以通过几种方式实现这一目标.

  1. 明确地在调用的范围单元中f:

    interface
      function f(A)
        implicit none
        real, intent(in) :: A(5)
        real :: f(5)
      end function
    end interface
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将函数作为内部函数放在程序主机作用域中:

     program main
        ...
     contains
       function f(A)
         implicit none
         real, intent(in) :: A(5)
         real :: f(5)
    
         f = A+1
       end
     end program
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将功能放在一个模块中:

     module A
     contains
       function f(A)
         implicit none
         real, intent(in) :: A(5)
         real :: f(5)
    
         f = A+1
       end
     end module
    
     program main
       use A
       ...
     end program
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用具有相同参数的不同过程的显式接口,并返回类型,种类和等级.

    program main
      interface
        function r5i_r5o(r5)
          implicit none
          real, intent(in) :: r5(5)
          real :: r5i_r5o(5)
        end function
      end interface
    
      procedure(r5i_r5o) :: f
      ...
    end program
    
    function f(A)
      implicit none
      real, intent(in) :: A(5)
      real :: f(5)
    
      f = A+1
    end
    
    Run Code Online (Sandbox Code Playgroud)

最简洁的方法是使用模块选项#3.这为您提供了自动显式接口的好处(不需要在您调用的任何地方执行选项#1 f),并且在使用模块的任何地方都可以使用您的功能,而不是像选项#2那样限于特定的作用域单元.如果有许多具有相同参数和返回类型的过程,则选项#4可以很方便,因为可以为所有这些过程重用一个显式接口.