コンパイル(gfortran 5.3または7.2)して次のコードを実行すると、main.f03の9行目は呼び出されないサブルーチンになります。なぜ誰かが説明できますか?gfortranはタイプバインドの手順が間違っています
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:「minimalisticcase.f03私たちはデータロガーの 'do_something' と呼ぶのライン40に
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
。しかし、代わりにDataStructureの 'beginning_of_alphabet'サブルーチンが実行されます!
「minimalisticcase.f03」の13行目をtype(DataStructure), pointer :: data_structure
からclass(DataStructure), pointer :: data_structure
に変更することで、これを修正できます。
なぜですか?
すべてが働いています。最初の 'init_data_structure'、' init_data_logger'、最後に 'do_something'です。 –
@マット:それはinteresstingだ!私はウィンドウと私のLinuxマシンの両方で動作を再現することができます。どのプラットフォームで作業していますか? – piiipmatz
私はWSLでgfortranを使ってWindows 10(64bit)でこれをテストしました。 –