我有这个函数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数组索引| 你能救我吗?
答案 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