派生类型中的关联指针? gFortran与英特尔

时间:2009-12-15 18:27:59

标签: pointers fortran 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)是我实际期待的。但是英特尔编译器提供不同结果的事实使我担心我的代码可能不正确。我是否在这个例子中做了一些非常错误的指针?有什么想法或解释吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:12)

您正在测试是否关联指针而未在指针上明确使用nullifycommon Fortran mistakes备注上的精彩页面(删除了代码示例):

  

许多人认为从未关联过的指针的状态是.not。相关。这是错误的。 (...)当声明指针时,其状态未定义,并且无法使用associated内在函数安全地查询。

看起来gfortran编译器可能被设置为显式地使声明上的指针无效 - 你应该想到这就像编译器自动将声明的变量设置为零,并且不依赖于该行为。如果你想确定,你将自己取消它。

修改

我正在阅读英特尔编译器指南,它指定了如何确保指针无效 - 您可以将派生类型设置为

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

但请注意,似乎这仅限于Fortran 95,如链接文章所述。