2009-12-15 45 views
8

我想檢查一個派生類型內的指針是否已經定義或不。我寫了下面簡單的代碼向你展示我的問題:派生類型中的關聯指針? gFortran與英特爾

program test 
implicit none 

type y 
    real(8), pointer :: x(:) 
end type y 
type(y), pointer :: w(:) 

allocate(w(2)) 
allocate(w(1)%x(2)) 

write(*,*) associated(w(1)%x), associated(w(2)%x) 

end program test 

編譯此代碼與gFortran 4.4.1和運行在Ubuntu上它給出結果:

T F 

,而在Windows編譯相同的代碼Vista與英特爾Fortran編譯器11.0提供:

T T 

第一個結果(gFortran)就是我所期望的。但是,英特爾編譯器提供了不同的結果,這讓我擔心我的代碼可能不正確。我在做這個例子中的指針有什麼問題嗎?任何想法或解釋?

非常感謝您的幫助!

回答

11

您正在測試以查看指針是否未關聯指針而明確使用nullify。關於common Fortran mistakes備註(摘自代碼示例)的精彩文章:

許多人認爲從未關聯過的指針的狀態是.not。相關。這是錯誤的。 (...)當聲明一個指針時,其狀態是未定義的,並且不能安全地用associated內在查詢。

它看起來像gfortran編譯器可以設立明確廢止的宣言指針 - 你應該想到這一點,如編譯器聲明的變量自動設置爲零,並且這種行爲不算。如果你想確定,你會自己廢除它。

編輯

我讀通過英特爾編譯器引導,並指定如何確保指針正確無效 - 你可以設置你的派生類型

type y 
    real(8), pointer :: x(:) => null() 
end type y 

但是,請注意,它似乎只限於Fortran 95,如鏈接文章中所述。

+0

非常感謝!這確實是問題所在。英特爾編譯器和gFortran都可以很好地解決您的問題。 – remek 2009-12-15 20:01:52