2009-12-15 69 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