【问题标题】:Associated pointers in derived type? gFortran vs. Intel派生类型中的关联指针? gFortran 与英特尔
【发布时间】:2009-12-15 18:27:58
【问题描述】:

我想检查派生类型中的指针是否已经定义。我写了以下简单的代码来告诉你我的问题:

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) 正是我所期待的。但英特尔编译器提供不同结果的事实让我担心我的代码可能不正确。我对这个例子中的指针做错了什么吗?有什么想法或解释吗?

非常感谢您的帮助!

【问题讨论】:

    标签: pointers fortran gfortran


    【解决方案1】:

    您正在测试是否在未在指针上显式使用nullify 的情况下关联指针。 common Fortran mistakes 上的精彩页面备注(已删除代码示例):

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

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

    编辑

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

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

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

    【讨论】:

    • 非常感谢!!这确实是问题所在。您建议的解决方案非常适用于英特尔编译器和 gFortran。
    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多