【发布时间】:2018-03-04 07:55:02
【问题描述】:
当我们编译(gfortran 5.3 或 7.2)并运行以下代码时,main.f03 的第 9 行最终出现在一个从未调用过的子例程中。谁能解释一下为什么?
main.f03:
program main
use minimalisticcase
implicit none
type(DataStructure) :: data_structure
type(DataLogger) :: data_logger
call data_structure%init()
call data_logger%init(data_structure)
end program
minimalisticcase.f03:
module minimalisticcase
implicit none
type, public :: DataStructure
integer :: i
contains
procedure, pass :: init => init_data_structure
procedure, pass :: a => beginning_of_alphabet
end type
type, public :: DataLogger
type(DataStructure), pointer :: data_structure
contains
procedure, pass :: init => init_data_logger
procedure, pass :: do_something => do_something
end type
contains
subroutine init_data_structure(self)
implicit none
class(DataStructure), intent(inout) :: self
write(*,*) 'init_data_structure'
end subroutine
subroutine beginning_of_alphabet(self)
implicit none
class(DataStructure), intent(inout) :: self
write(*,*) 'beginning_of_alphabet'
end subroutine
subroutine init_data_logger(self, data_structure)
implicit none
class(DataLogger), intent(inout) :: self
class(DataStructure), target :: data_structure
write(*,*) 'init_data_logger'
self%data_structure => data_structure
call self%do_something()
end subroutine
subroutine do_something(self)
implicit none
class(DataLogger), intent(inout) :: self
write(*,*) 'do_something'
end subroutine
end module
在“minimalisticcase.f03”的第 40 行,我们将 DataLogger 称为“do_something”。但改为执行 DataStructure 的 'beginning_of_alphabet' 子程序!
显然可以通过将“minimalisticcase.f03”中的第 13 行从 type(DataStructure), pointer :: data_structure 更改为 class(DataStructure), pointer :: data_structure 来解决此问题。
但是为什么呢?
【问题讨论】:
-
ifort 17 和 gfortran 7.2 对我来说一切正常。首先是
init_data_structure,然后是init_data_logger,最后是do_something。 -
@马特:这很有趣!我可以在我的 Windows 和我的 linux 机器上重现这种行为。您在哪个平台上工作?
-
我在 Windows 10(64 位)上测试了这个,在 WSL 中使用 gfortran。
标签: fortran procedure gfortran derived-types