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

时间:2014-10-13 19:03:53

标签: fortran

我有返回数组的函数,比如说

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

    f = A+1
end

我的问题是,如何在主程序单元中定义f? E.g。

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

    ...
end 

2 个答案:

答案 0 :(得分:7)

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

  1. 明确地在调用f

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

     program main
        ...
     contains
       function f(A)
         implicit none
         real, intent(in) :: A(5)
         real :: f(5)
    
         f = A+1
       end
     end program
    
  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
    
  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
    
  5. 最简单的方法是使用模块选项#3。这为您提供了自动显式接口的好处(不需要在调用f的任何地方执行选项#1)并使您的功能在模块使用的任何地方都可用,而不是像选项#2中那样限于特定的作用域单元。如果你有许多具有相同参数和返回类型的过程,那么选项#4会很方便,因为可以为所有这些过程重用一个显式接口。

答案 1 :(得分:1)

这显示了指定函数结果的三种不同方法,以及如何使用模块来组织函数:

module so_func

    INTEGER, PARAMETER :: MAX_SIZE = 5

    TYPE MY_DATA
        INTEGER :: SIZE
        REAL, DIMENSION(MAX_SIZE) :: DATA
    ENDTYPE


contains

    FUNCTION f1(A,N) RESULT(X)
    implicit none
    INTEGER, INTENT(IN) :: N
    REAL, INTENT(IN) :: A(N)
    REAL :: X(N)
    ! ....
    X = 1.0+A
    END FUNCTION f1

    TYPE(MY_DATA) FUNCTION f2(A,N)
    implicit none
    INTEGER, INTENT(IN) :: N
    REAL, INTENT(IN) :: A(N)
    ! ....
    f2%SIZE = N
    f2%DATA(1:N) = 1.0+A
    END FUNCTION f2

    FUNCTION f3(A,N)
    implicit none
    INTEGER, INTENT(IN) :: N
    REAL, INTENT(IN) :: A(N)
    REAL :: f3(N)
    ! ....
    f3 = 1.0+A
    END FUNCTION f3

end module


program SO_RESULT
    use so_func
    implicit none
    integer, parameter :: n=5
    REAL :: A(n), y1(n), y3(n)    
    TYPE(MY_DATA) :: y2
    INTEGER :: i
    ! Variables

    A =(/ (i, i=1,n) /)

    y1 = f1(A,n)
    y2 = f2(A,n)
    y3 = f3(A,n)


end program SO_RESULT