首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数返回值的过早终结

函数返回值的过早终结
EN

Stack Overflow用户
提问于 2012-06-25 13:23:40
回答 2查看 198关注 0票数 1

我有一个派生类型的t_file,它有一个终结例程close,它只是将“终结”写到屏幕上。还有一个函数返回t_file类型的实例。这个程序的输出是

代码语言:javascript
复制
Finalization.
Finalization.
Just opened
     2000
Done.

我有两个问题:

  • 为什么要在Just opened输出之前完成?
  • 为什么要完成两次

我的编译器是Intel(R) Visual Fortran Composer XE 2011 12.1.3526.2010。

以下是代码:

代码语言:javascript
复制
module m_file
    implicit none


    type t_file
        integer::iu=1000

        contains

        final::close
    end type

    contains

    function openFile() result(f)
        implicit none

        type(t_file)::f

        f%iu = 2000

    end function

    subroutine close(this)
        implicit none

        type(t_file)::this

        write(*,*) 'Finalization.'

    end subroutine

end module

program foo
    use m_file
    implicit none

    type(t_file)::f

    f = openFile()
    write(*,*) 'Just opened'
    write(*,*) f%iu

    write(*,*) 'Done.'    
    read(*,*)

end program
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-25 14:17:16

这种行为也使我感到惊讶。我已经掌握了Fortran的新(-ish) OO特性,但还不需要编写最终的过程。我想我可以为这种行为提供某种解释。

作者在p282 of Modern Fortran Explained上写道:

当可终结的对象即将停止存在时(例如,通过解除分配或执行return语句),将以对象作为其实际参数调用最终的子例程。当对象被传递给意图out虚拟参数时,或者是内部赋值语句左侧的变量时,也会发生这种情况。在后一种情况下,最后的子例程是在计算了右侧的表达式之后,而是在分配给变量之前调用的。

在我看来,这两种情况都发生在这一段中。当函数中的名为Finalization的实体f即将从该函数返回时超出范围时,您将得到第一个openFile

当在赋值Finalization的lhs上使用程序范围中的变量f时,您将得到第二个f = openFile()

从所有这些我得出的结论是,您没有看到f在程序范围内过早地完成,而是一些微妙的不同。

我并不完全相信这就是正在发生的事情,我想不出为什么语言的行为应该是这样的。我有点惊讶,因为我已经研究过了,当程序结束而f超出范围时,您没有收到第三条f消息。

如果幸运的话,一个真正的佛特兰古鲁很快就会过去,并启发我们所有人。

票数 5
EN

Stack Overflow用户

发布于 2013-03-05 07:34:43

高性能标记给出的小更正:第一个终结实际上是程序范围中的变量f。这可以简单地通过让最后的例程打印这个%iu并将程序范围中的f%iu设置为一些任意值就可以看出。

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

https://stackoverflow.com/questions/11190225

复制
相关文章

相似问题

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