2012-08-10 46 views
3

在一些Fortran 95代碼中,我有一個帶指針字段的類型。我想聲明一個在編譯時初始化的模塊變量type(foo)。類似這樣的:是否有可能在Fortran的類型構造函數中使用指針?

module foo_module 
    implicit none 
    type foo_type 
    integer :: x 
    logical, pointer :: x_flag => null() 
    end type foo_type 

    logical, target :: bar_flag 
    ! this does not compile of course: 
    type(foo_type) :: bar = foo_type(1, bar_flag) 
end module foo_module 

上面的代碼片段不能編譯。我知道我可以使用一個單獨的子程序,像在運行時初始化bar

module foo_module 
    implicit none 
    type foo_type 
    integer :: x 
    logical, pointer :: x_flag => null() 
    end type foo_type 

    logical, target :: bar_flag 
    type(foo_type) :: bar 
contains 
    subroutine init() 
    bar%x = 1 
    bar%x_flag => bar_flag 
    end subroutine init 
end module foo_module 

但有可能做到這一點沒有初始化子程序?或者是否可以聲明由編譯器明確調用的初始化子例程?注意:這必須在Fortran 95中完成。

回答

6

初始化程序(在示例代碼的第一個塊的bar聲明中的equals之後出現的東西)必須是初始化(常量)表達式。 Fortran 95中的初始化表達式規則不允許在結構構造函數中使用NULL()以外的指針。

(這條規則是在2008年的Fortran放寬,允許在結構構造函數指針的目標在初始化表達式與保存屬性變量。)

請注意,你的初始化子程序可以使用結構構造函數,而不是分配給個別組件。使用該模塊的客戶端代碼也可以使用結構構造函數直接執行賦值來禁止:bar = foo_type(1, bar_flag)。問題不在於在結構構造函數中使用指針目標 - 它是在結構構造函數中的地方出現的指針目標,它必須是初始化表達式

無法爲派生類型聲明初始化過程。 (在Fortran 2003中可能有一個覆蓋結構構造函數的函數,但是這樣的函數不能用於初始化表達式中。)

+0

感謝您的出色解釋。被限制爲Fortran 95語言子集確實吸收:( – abbot 2012-08-10 20:30:21

相關問題