gpt4 book ai didi

recursion - Fortran 函数调用引发错误 : Statement function at (1) is recursive at compilation

转载 作者:行者123 更新时间:2023-12-02 10:51:55 28 4
gpt4 key购买 nike

我继承了 的遗产Fortran 77 我现在的代码 试试 前往 编译 Fortran 2003 标准。我对 Fortran (我知道 C 和 Python)一无所知,我正在学习它。

下面的代码片段会导致编译器错误(也在下面给出)。说实话,光看这段代码就很头疼:我真的不明白怎么能写出这样一行代码

A(i) = A(i) + B(q)

其中 A 和 B 都是函数。我熟悉 C 和 Python 中递归函数的概念,如果我是此处介绍的这种情况下的编译器,我可能会提示并至少提出 见鬼警告。

我不希望任何人为我修复此代码。如果有人可以向我解释该行(尝试)要实现的目标,我将非常高兴:

cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l)/dy/depth(i,j,k)  

或者把我介绍给我可以查到的好地方。

下面是代码片段和相应的编译器错误。
IF( lipr ) THEN
!-----Change from X-direction horizontal advection
l = 1
DO i=i1+1,i2-1
l = l+1
IF( ipa_cel(i,j,k) .GT. 0 ) THEN
ipa_idx = ipa_cel(i,j,k)
!-----Flux at west boundary
cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l)/dy/depth(i,j,k)
!-----Flux at east boundary
cipr(IPR_EADV, ipa_idx, ispc) = cipr(IPR_EADV, ipa_idx, ispc) + fc2(l)/dy/depth(i,j,k)
!-----Average volume
cipr(IPR_VOL, ipa_idx, ispc) = cipr(IPR_VOL, ipa_idx, ispc) + dx(j)*dy*depth(i,j,k)
npastep(ipa_idx,ispc) = npastep(ipa_idx,ispc) + 1
END IF
END DO
END IF

编译器将此输出消息作为错误提供
gfortran -std=f2003  -c -g -o build/Debug/GNU-Linux-x86/xyadvec.o
xyadvec.f03 xyadvec.f03:177.42:

cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l
1
Error: Statement function at (1) is recursive

最佳答案

大概cipr是一个数组,不知何故编译器不知道这一点。在这种情况下,该行被解释为一个语句函数。

例如,

program dummy
dimension c(10)
c(i) = c(i) + d
end program

这将编译(除了关于统一变量使用的警告),如 c是一个数组,该行更新数组中的一个元素,类似于 c[i] += d会在C中做。

如果 c 不是数组,则该行将被解释为单行函数,类似于宏。所以,例如:
program dummy
c(i) = 2*i
...
myvar = c(2)
end program

这里 c 是一个返回两倍参数的函数,所以 myvar将是 4。

所以,在你的情况下,我会从 cipr 的用法猜测旨在成为一个数组, cipr 的声明有问题或使用一些声明 cipr 维度的包含文件.因为编译器随后将其解释为语句函数,所以它失败了。

你能给出出现这一行的整个文件吗?

关于recursion - Fortran 函数调用引发错误 : Statement function at (1) is recursive at compilation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19752080/

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