函数结果没有隐式类型

时间:2017-05-03 19:38:29

标签: function fortran

以下是解决我遇到的问题的示例代码。我得到的错误信息是

  

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

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

我试图关注this other question,但我无法弄明白。这个函数在我的程序中的一个模块中,我确保模块有contains,并在此函数后结束模块。

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

Real前面添加Complexfunction有效,但我不明白为什么。我不应该只能使用复杂的,因为数组在函数内是复杂的吗?哪个更适合我的实际功能?两者都不会产生编译错误。

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

2 个答案:

答案 0 :(得分:4)

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

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

integer function add(m,n)
    integer, intent(in) :: a,b
    add = a+b
end function

该函数被称为add,你可以看到(a)结果是整数类型(默认类型和标量)和(b)结果是通过将两个参数加在一起形成的。

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

的内容
 integer(1:4) add_vec(m1,m2)

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

   function add(m,n) result(addvec)
        integer, intent(in) :: a(4),b(4)
        integer, dimension(4) :: addvec
        ....
    end function

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

在OP的情况下,我认为sample旨在返回复数值的rank-2数组。我认为OP需要替换

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

function Sample(func)  result(LocalF)

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

此外...... 在功能前添加Real或Complex,但我真的不明白为什么。

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

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

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

答案 1 :(得分:1)

Fortran中的过程有两种类型:函数和子例程。这个问题是关于功能的,所以我会考虑那些。

第一个修订中缺少的是关于函数结果 1 的隐式类型的错误,是结果类型。

添加real function ...complex function ...等,通过显式提供函数结果的类型来解决该问题。链接的文档提供了其他方法。

引用函数时使用函数的结果。当我们有像

这样的参考时
func0 = Sample(func)

在主程序中,调用函数Sample并在其执行中定义函数结果。在函数执行结束时,其结果将放在引用的表达式中。

所以,如果你宣布

real function Sample(func)

complex function Sample(func)

你所说的是函数结果是一个真实的或复杂的实体。在评估函数时,表达式中使用了Sample末尾的值(此处为赋值)。

由于函数结果是通过Sample返回的(在这种情况下),我们需要定义它的值。这个问题需要注意的重要一点是,LocalF是函数的变量。如果你的意思是它是函数的结果,你需要使用函数结果。

您有多种选择:

function Sample(func)
  <type>, <attributes> :: sample  ! Instead of LocalF
  ...                  :: func
end function

function Sample(func) result(LocalF)
  <type>, <attributes> :: LocalF
  ...                  :: func
end function

你甚至可以拥有

<type> function Sample(func)
  <attribute statements for Sample>
  ... func
end function

但我真的建议你避免使用最后一个。

1 注意这里的错误是关于函数结果的类型;在链接问题中简单介绍了引用时的函数。