2015-06-15 92 views
1

我買了這個共同的煩惱:Fortran派生類型的公共:初始化?

 COMMON /REDCOM/ DPREC,NITMA,INDIC,NBERR,NCAR,KMOTLU, 
    &    REDVAR,MOCDER(2) 
     COMMON /REDCO1/ CTEXT 
C 
     type(double_st) :: DPREC 
     INTEGER :: NITMA,INDIC,NBERR,NCAR,KMOTLU,REDVAR,MOCDER 
     CHARACTER(72) :: CTEXT 
     CHARACTER(4) :: CTEXT4 
C 
     EQUIVALENCE (CTEXT,CTEXT4) 

double_st派生類型是:

type double_st 
    sequence 
    real(kind(0.d0)) :: x,y,z 
    integer :: acc = -1 
    end type double_st 

試圖編譯一些代碼,包括這個共同的,我得到:

ifort:

./REDCOM.INC(1): error #6005: A derived type object in a COMMON block shall not have default initialization [DPREC] 
     COMMON /REDCOM/ DPREC,NITMA,INDIC,NBERR,NCAR,KMOTLU, 
----------------------^ 

gfortran:

REDCOM.INC:1.27: 
    Included at m_abaq4.f:90: 

     COMMON /REDCOM/ DPREC,NITMA,INDIC,NBERR,NCAR,KMOTLU,    
          1 
Error: Derived type variable 'dprec' in COMMON at (1) may not have default initializer 

對Fortran不太瞭解,我不明白問題是什麼,或者如何解決它(我嘗試了谷歌搜索沒有成功)。如果我使用REAL(8)而不是double_st,則一切正常。

有人可以幫助我嗎?

回答

3

從線

integer :: acc = -1 

條關閉後

= -1 

離開

integer :: acc 

重新編譯,看看會發生什麼。該錯誤消息表明,程序無法初始化派生類型組件,並在common語句中使用該派生類型的變量。在Fortran標準中使用'Initialize'來精確地表示在其聲明中設置變量(或元素)的值。

在我的(草案)版本的Fortran 2008標準中,規則503中的約束506禁止初始化公用塊中使用的派生類型變量的組件。這種禁止似乎不適用於內部類型變量的初始化,因此編譯器在變量類型爲real(8)時接受代碼。

至於在普通塊中使用派生類型,那就是混合範式編程(如果有的話)!

+0

事實上,它只適用於ifort,它仍然失敗,gfortran ... – janou195

+0

@ janou195它究竟打印什麼?代碼的外觀如何? –

+0

錯誤消息仍然與我的問題相同。你指的是哪個代碼? – janou195

2

我說的和High Performance Mark's answer差不多,但希望稍微詳細一點。在答案的編輯之後,我實際上有點分歧。

具有類型聲明

type double_st 
    sequence 
    real(kind(0.d0)) :: x,y,z 
    integer :: acc = -1 
end type double_st 

涉及默認初始化。這是acc=1部分:請參閱Fortran 2008 4.5.4.6。它不僅僅是默認初始化的組件,而是整個類型。

有一個約束(C5105,在5.7.2.1),其說

如果共同 - 嵌段 - 對象是派生型的,類型應具有BIND屬性或SEQUENCE屬性,它不應該有默認的初始化。

這是編譯器抱怨的。使用real(kind(0d0))(或real(8))不違反此限制。內在類型(如real)不能有默認的初始化,但它們可以有明確的初始化(如real :: hello = 1.)。對使用明確初始化的對象有一些限制(例如在其他答案中提到的C506),但是這個問題還不夠清楚,我不能進一步評論。