我读过,取决于函数结果变量的值是非标准的Fortran。
integer function my_sum(x, n)
integer, dimension(n), intent(in) :: x
integer , intent(in) :: n
integer :: i
my_sum = 0
do i = 1, n
my_sum = my_sum + x(i) ! Error! Cannot re-use my_sum
end do
end function
相反,我们必须使用局部变量,并将其赋值到函数的末尾。为了明确起见,我并不期望在调用之间保存值,而是在函数体中,就好像它是一个局部变量一样。
这句话在Fortran 90或以后是否正确?它工作在我的编译器(英特尔),但我不确定这是否是标准,没有发现除了随机的大学幻灯片在线。
编辑:我找到了函数名称的源代码。它位于这份报告的幻灯片4中,链接自官方的fortran-lang.org网站。
函数中的某个位置必须有这样的一个或多个赋值语句: 函数名称=表达式 将表达式的结果保存到函数的名称中。 请注意,函数名不能出现在任何表达式的右侧.
发布于 2022-09-16 13:20:05
我不认为你读到的是真的。
对于函数结果变量(除非您的程序做出了其他规定),其名称与函数本身的名称相同,我必须提交的语言标准的最新版本(BS ISO/IEC 1539-1:2018 15.6.2.2注1)规定:
函数结果与函数子程序局部的任何其他实体(变量或过程指针)相似。它的存在从函数的执行开始时开始,在函数的执行被终止时结束。但是,由于该实体的最终值随后用于对调用函数的表达式的计算,因此实现可能会推迟释放该实体占用的存储,直到将其值用于表达式计算之后。
我将此解释为您的编译器编译代码是正确的。我还以代码显示的方式使用了结果变量,并且不记得在使用过程中遇到过问题。
发布于 2022-09-16 13:44:56
这句话
请注意,函数名不能出现在任何表达式的右侧.
要么困惑要么让人困惑。表达在任何有意义的意义上都没有“右手边”。从问题的例子中,循环中赋值中的表达式是my_sum + x(i)
,它位于赋值的右边。
把它留在一边,似乎还有别的东西不见了。文本中的限制很可能是指对…的限制。考虑(不完整的)
function f(n)
f = f(n-1)
end function
在这里,名称f
不能作为函数引用。您需要使用结果子句来分隔函数结果的名称和函数本身。
正如高性能标记所指出的(我将不再详细地重复),对于能够定义函数结果不止一次,或者在定义函数结果之后引用函数结果,没有任何限制。
还请注意,引用的语句的第一部分不正确:
函数中的某个位置必须有这样的一个或多个赋值语句: 函数名称=表达式 将表达式的结果保存到函数的名称中。
函数结果必须定义,但是(即使在Fortran 90中)还有其他方法来定义变量,而不会在赋值语句中出现它。作为个人建议,我将避免依赖这份文件,因为它缺乏精确性,并声明打算与可怕的老Fortran 90标准有关。现代的Fortran是一个更好的野兽。
https://stackoverflow.com/questions/73745237
复制相似问题