首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >您能在Fortran中重用函数结果吗?

您能在Fortran中重用函数结果吗?
EN

Stack Overflow用户
提问于 2022-09-16 13:02:06
回答 2查看 95关注 0票数 2

我读过,取决于函数结果变量的值是非标准的Fortran。

代码语言:javascript
运行
复制
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网站。

函数中的某个位置必须有这样的一个或多个赋值语句: 函数名称=表达式 将表达式的结果保存到函数的名称中。 请注意,函数名不能出现在任何表达式的右侧.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-16 13:20:05

我不认为你读到的是真的。

对于函数结果变量(除非您的程序做出了其他规定),其名称与函数本身的名称相同,我必须提交的语言标准的最新版本(BS ISO/IEC 1539-1:2018 15.6.2.2注1)规定:

函数结果与函数子程序局部的任何其他实体(变量或过程指针)相似。它的存在从函数的执行开始时开始,在函数的执行被终止时结束。但是,由于该实体的最终值随后用于对调用函数的表达式的计算,因此实现可能会推迟释放该实体占用的存储,直到将其值用于表达式计算之后。

我将此解释为您的编译器编译代码是正确的。我还以代码显示的方式使用了结果变量,并且不记得在使用过程中遇到过问题。

票数 5
EN

Stack Overflow用户

发布于 2022-09-16 13:44:56

这句话

请注意,函数名不能出现在任何表达式的右侧.

要么困惑要么让人困惑。表达在任何有意义的意义上都没有“右手边”。从问题的例子中,循环中赋值中的表达式是my_sum + x(i),它位于赋值的右边。

把它留在一边,似乎还有别的东西不见了。文本中的限制很可能是指对…的限制。考虑(不完整的)

代码语言:javascript
运行
复制
function f(n)
  f = f(n-1)
end function

在这里,名称f不能作为函数引用。您需要使用结果子句来分隔函数结果的名称和函数本身。

正如高性能标记所指出的(我将不再详细地重复),对于能够定义函数结果不止一次,或者在定义函数结果之后引用函数结果,没有任何限制。

还请注意,引用的语句的第一部分不正确:

函数中的某个位置必须有这样的一个或多个赋值语句: 函数名称=表达式 将表达式的结果保存到函数的名称中。

函数结果必须定义,但是(即使在Fortran 90中)还有其他方法来定义变量,而不会在赋值语句中出现它。作为个人建议,我将避免依赖这份文件,因为它缺乏精确性,并声明打算与可怕的老Fortran 90标准有关。现代的Fortran是一个更好的野兽。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73745237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档