我想检查派生类型中的指针是否已经定义。我写了以下简单的代码来向您展示我的问题:
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)是我实际期待的。但是英特尔编译器提供不同结果的事实使我担心我的代码可能不正确。我是否在这个例子中做了一些非常错误的指针?有什么想法或解释吗?
非常感谢您的帮助!
答案 0 :(得分:12)
您正在测试是否关联指针而未在指针上明确使用nullify
。 common Fortran mistakes备注上的精彩页面(删除了代码示例):
许多人认为从未关联过的指针的状态是.not。相关。这是错误的。 (...)当声明指针时,其状态未定义,并且无法使用
associated
内在函数安全地查询。
看起来gfortran编译器可能被设置为显式地使声明上的指针无效 - 你应该想到这就像编译器自动将声明的变量设置为零,并且不依赖于该行为。如果你想确定,你将自己取消它。
修改强>:
我正在阅读英特尔编译器指南,它指定了如何确保指针无效 - 您可以将派生类型设置为
type y
real(8), pointer :: x(:) => null()
end type y
但请注意,似乎这仅限于Fortran 95,如链接文章所述。