9

派生型内のポインターが既に定義されているかどうかを確認したいと思います。私の問題を示すために、次の簡単なコードを書きました。

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

一方、インテル Fortran コンパイラー 11.0 を使用して Windows Vista でコンパイルされた同じコードは、以下を提供します。

T T

最初の結果 (gFortran) は、私が実際に期待しているものです。しかし、Intel コンパイラが異なる結果を提供するという事実は、私のコードが正しくないのではないかと心配しています。この例のポインターで何かひどく間違ったことをしていますか? アイデアや説明はありますか?

ご協力いただきありがとうございます。

4

1 に答える 1

13

ポインタを明示的に使用せずに、ポインタが関連付けられているかどうかをテストしnullifyています。一般的なFortranの間違いに関するすばらしいページ(コードサンプルを削除):

多くの人は、関連付けられたことのないポインタのステータスは.notであると考えています。関連する。これは誤りです。associated(...)ポインターが宣言されると、そのステータスは未定義であり、組み込み関数で安全に照会することはできません。

gfortranコンパイラは、宣言時にポインタを明示的に無効にするように設定されているようです。おそらく、コンパイラが宣言された変数を自動的にゼロに設定し、その動作を期待しないように考える必要があります。確認したい場合は、自分で無効にします。

編集

インテル®コンパイラー・ガイドを読んでいますが、ポインターが正しく無効化されていることを確認する方法を指定しています。派生型を次のように設定できます。

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

ただし、リンク先の記事で説明されているように、これはFortran95に限定されているように見えることに注意してください。

于 2009-12-15T19:29:11.663 に答える