gfortran 关联了错误的类型绑定过程
gfortran associates wrong type-bound procedure
当我们编译(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
.
来解决这个问题
但是为什么呢?
这是 gfortran 中的错误。我将它作为 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82312 发布在 Bugzilla 上。该错误现已在 GCC 主干上修复。
临时解决方法是将指针赋值封装在 select 类型中,因此:
select type (data_structure)
type is (DataStructure)
self%data_structure => data_structure
end select
当我们编译(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
.
但是为什么呢?
这是 gfortran 中的错误。我将它作为 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82312 发布在 Bugzilla 上。该错误现已在 GCC 主干上修复。
临时解决方法是将指针赋值封装在 select 类型中,因此:
select type (data_structure)
type is (DataStructure)
self%data_structure => data_structure
end select