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

而在 Windows Vista 上使用英特尔 Fortran 编译器 11.0 编译的相同代码提供:

T T

第一个结果(gFortran)是我真正期待的。但英特尔编译器提供不同结果的事实让我担心我的代码可能不正确。我对这个例子中的指针做错了什么吗?有什么想法或解释吗?

非常感谢您的帮助!

4

1 回答 1

13

您正在测试是否在没有明确使用指针的情况下关联nullify指针。关于常见 Fortran 错误注释的精彩页面(删除了代码示例):

许多人认为从未关联过的指针的状态是.not。联系。这是错误的。(...) 当一个指针被声明时,它的状态是未定义的,并且不能用associated内在函数安全地查询。

看起来 gfortran 编译器可以设置为在声明时显式地使指针无效 - 您可能应该认为这就像编译器自动将声明的变量设置为零一样,而不是指望这种行为。如果您想确定,您将自己取消它。

编辑

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

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

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

于 2009-12-15T19:29:11.663 回答