我有一个派生类型的t_file,它有一个终结例程close,它只是将“终结”写到屏幕上。还有一个函数返回t_file类型的实例。这个程序的输出是
Finalization.
Finalization.
Just opened
2000
Done.我有两个问题:
Just opened输出之前完成??
我的编译器是Intel(R) Visual Fortran Composer XE 2011 12.1.3526.2010。
以下是代码:
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发布于 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消息。
如果幸运的话,一个真正的佛特兰古鲁很快就会过去,并启发我们所有人。
发布于 2013-03-05 07:34:43
高性能标记给出的小更正:第一个终结实际上是程序范围中的变量f。这可以简单地通过让最后的例程打印这个%iu并将程序范围中的f%iu设置为一些任意值就可以看出。
https://stackoverflow.com/questions/11190225
复制相似问题