gpt4 book ai didi

函数结果没有隐式类型

转载 作者:行者123 更新时间:2023-12-03 06:23:48 26 4
gpt4 key购买 nike

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

Function result 'sample' at (1) has no IMPLICIT type.

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

我试图关注this other question ,但是我无法弄清楚。该函数位于我程序的一个模块内,我确保该模块具有 contains 并且我在该函数之后结束该模块。

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

function前面添加RealComplex是可行的,但我真的不明白为什么。由于函数内部的数组很复杂,我不应该只能使用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

最佳答案

在 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)

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

此外...在函数前面添加实数或复数是可行的,但我真的不明白为什么。

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

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

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

关于函数结果没有隐式类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43768605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com