功能结果没有隐式类型



以下是一个示例代码,可以解决我遇到的问题。我收到的错误消息是

函数结果"样本"(1(没有隐式类型。

i标签,线(1(在下面。

我试图解决这个其他问题,但是我无法弄清楚。此功能在我的程序中的一个模块中,我确保模块具有contains,并且在此功能之后结束模块。

我也在此功能中使用implicit none,因此我不确定为什么会收到此消息。如何修复此错误消息?

function的前面添加RealComplex工作,但我真的不明白。由于数组在功能内部是复杂的,我不应该只能使用复合物吗?哪个更适合我的实际功能?两者都不会产生汇编错误。

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

在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是返回复杂值的等级2数组。我认为OP需要替换

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

function Sample(func)  result(LocalF)

看看情况如何。在这里,如果还不明显,您会发现结果名称不必与函数的名称相同。

此外

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

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

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

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 请注意,此处的错误是有关函数结果的类型;在引用时仅有关函数的链接问题中。

最新更新