函数结果没有隐式类型

Jef*_*aci 2 fortran function

下面是解决我遇到的问题的示例代码。我收到的错误消息是

(1) 处的函数结果 'sample' 没有 IMPLICIT 类型。

我标记了第 (1) 行在下方的位置。

我试图关注另一个问题,但是我无法弄清楚。这个函数在我的程序中的一个模块中,我确保该模块具有contains并且我在这个函数之后结束了该模块。

我也在implicit none这个函数中使用,所以我不确定为什么会收到这条消息。如何修复此错误消息?

添加RealComplexfunction作品前,但我真的不明白为什么。由于函数内部的数组很复杂,我不应该只能使用 complex 吗?哪个更适合我的实际功能?两者都不会产生编译错误。

real function Sample(func)   !this is line (1)
!complex function Sample(func)

implicit none

integer :: n,m
real :: x,y
complex, dimension(-9:9,-9:9), intent(in) :: func
complex, dimension(-9:9,-9:9) :: LocalF

LocalF = func

do n=-9,9
do m=-9,9

    x = real(n)*0.2
    y = real(m)*0.2
    LocalF(n,m)= cmplx(z1(x,y),z2(x,y)) !assume z1,z2 are well defined

end do
end do

end function Sample
Run Code Online (Sandbox Code Playgroud)

Hig*_*ark 5

在 Fortran 中,每个函数都有一个结果。如果您愿意,可以将结果视为函数返回的值。与 Fortran 程序中的所有其他值一样,函数结果也有类型、种类和等级。

默认情况下,函数结果与函数本身具有相同的名称,并且其声明位于函数声明之前。例如,这里

integer function add(m,n)
    integer, intent(in) :: a,b
    add = a+b
end function
Run Code Online (Sandbox Code Playgroud)

该函数被调用add,您可以看到 (a) 结果是整数类型(以及默认类型和标量)和 (b) 结果是通过将两个参数相加而形成的。

对于返回数组的函数,此语法不可用,因此您不能编写类似

 integer(1:4) add_vec(m1,m2)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须明确定义结果变量的名称(以及稍后的类型和种类)。坚持一个简单的例子,比如

   function add(m,n) result(addvec)
        integer, intent(in) :: a(4),b(4)
        integer, dimension(4) :: addvec
        ....
    end function
Run Code Online (Sandbox Code Playgroud)

请注意,您没有定义结果的意图。

sample我认为在 OP 的情况下,打算返回一个 rank-2 的复数值数组。我认为OP需要更换

function Sample(func)   !this is line (1)
Run Code Online (Sandbox Code Playgroud)

function Sample(func)  result(LocalF)
Run Code Online (Sandbox Code Playgroud)

看看情况如何。在这里,如果它不明显,您将了解到结果名称不必与函数名称相同。

此外......在函数前添加 Real 或 Complex 有效,但我真的不明白为什么。

它可能在编译的意义上起作用,但执行它会导致流泪。通过告诉编译器函数结果是 arealcomplexvalue,您可以满足函数定义的语法要求。但是如果没有为结果变量(在 OP 的代码中调用)分配一个(realcomplex声明的)值,Sample该函数最多只会返回垃圾。

为了尽可能清楚......在OP的原始代码中有两个严重错误:

  1. 函数(结果)未指定显式类型,导致显示编译器消息。
  2. 函数不包括设置结果变量的值,即与函数同名的变量(在没有result子句的情况下)。