如何传递一个函数返回一个数组作为FORTRAN中的参数

时间:2014-04-07 21:49:30

标签: arrays function fortran

我有这个函数f,它返回一个数组,这个函数f作为函数g的参数给出,例如:

function f(a)
 real, dimension(2)::f
 real a
 f(1)=a
 f(2)=a+1
end function

function g(f)
 real, dimension(2)::f,g
 g=f(1.1)
end function

但是在线g = f(1.1)它出错了,fortran认为1.1是数组f的索引而不是f必须评估的值。 字面错误是: ||错误:遗留扩展:REAL数组索引| 你能救我吗?

1 个答案:

答案 0 :(得分:3)

您可以这样做,但您必须在f函数中明确定义g作为返回两个实数的函数,而不是数组2两个实数。不可否认,fortran中用于描述函数返回类型的约定使得这种区分不那么明显。

你定义类型函数的方式是interface block;该接口块描述了函数的返回类型及其参数列表。它基本上只是看起来像函数声明的前几行,删除了函数体。 (我在这里说“功能”,但实际上应该说“子程序”;它与子程序的工作原理相同)。然后编译器知道函数的返回值是什么,还知道参数列表。接口块就像基于C语言的函数原型。

为您的参数使用接口块如下所示:

module functions
implicit none

contains

    function f(a)
     real, dimension(2)::f
     real, intent(in) :: a
     f(1)=a
     f(2)=a+1
    end function

    function g(f)
     real, dimension(2)::g
     interface
        function f(x)
            real, dimension(2) :: f
            real, intent(in) :: x
        end function f
     end interface

     g=f(1.1)

    end function

end module functions

program test
    use functions
    implicit none

    real, dimension(2) :: result

    result = g(f)
    print *, 'result = ', result
end program test

结果如你所料:

$ gfortran -o interface_ex interface_ex.f90
$ ./interface_ex
 result =    1.1000000       2.0999999