2017-09-22 5 views
2

コンパイル(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に変更することで、これを修正できます。

なぜですか?

+0

すべてが働いています。最初の 'init_data_structure'、' init_data_logger'、最後に 'do_something'です。 –

+0

@マット:それはinteresstingだ!私はウィンドウと私のLinuxマシンの両方で動作を再現することができます。どのプラットフォームで作業していますか? – piiipmatz

+0

私はWSLでgfortranを使ってWindows 10(64bit)でこれをテストしました。 –

答えて

3

これはgfortranのバグです。私はhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=82312としてBugzillaに投稿しました。このエラーは、GCCトランクで修正されました。

一時的な回避策はthusly、選択型ではポインタ代入を包むためにある:17とのgfortran 7.2のifortの両方で私のために期待されるよう

select type (data_structure) 
     type is (DataStructure) 
     self%data_structure => data_structure 
    end select 
+0

レポートhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=82312ようこそ。ところで、あなたの名前は右のアイコンの隣に自動的にあなたの投稿の下に置かれるので、ここでは通常、ここでは挨拶に署名して使用しません。 –

+0

あなたの回避策は質問で述べたものとは異なります。 1つを他のものよりも優先したいという反発はありますか? (報告書を提出していただきありがとうございます) – piiipmatz

+0

バグは7枝で修正され、閉じます。レポートをありがとう。 – Paul

関連する問題