2015-07-10 38 views
4

在Fortran语言中,为具有TARGET属性的伪参数的过程提供的参数不具有TARGET属性导致无效的代码。但是,当使用gfortran(5.1.0)或ifort(14.0.0)编译下面的代码时,不会检测到错误,程序的行为与实际具有TARGET属性的参数相同。当我说它是无效代码或者这是编译器缺陷时,我错了吗?将具有TARGET属性的参数提供给伪参数具有TARGET属性的过程

program pointerization 
    implicit none 

    integer, dimension(3) :: A 
    integer, dimension(:), pointer :: ptr_A 

    A = [1, 2, 3] 
    call pointerize(A, ptr_A) 
    print*, "A=", ptr_A 

contains 
    subroutine pointerize(tab, ptr_tab) 
     integer, dimension(:), intent(in), target :: tab 
     integer, dimension(:), pointer :: ptr_tab 

     ptr_tab => tab 
    end subroutine 
end program 
+1

仅供参考,您的观点在Fortran参考§C.9.6 中提及ftp://ftp.nag.co.uk/sc22wg5/N1601-N1650/N1601.pdf.gz – jorispilot

回答

4

你是正确的,你有无效的代码。这不是,因为你说的原因。在你的情况下,假的参数tab具有目标属性是合法的,即使关联的实际参数A还没有。

即使指针赋值语句ptr_tab => tab是合法的。

什么是重要的,但是,是自2008年的Fortran以下(C.9.4,也见12.5.2.4)

如果nonpointer哑参具有TARGET属性和相应的实际参数不对,任何与伪参数关联的指针,因此在执行该过程期间使用实际参数,在过程的执行完成时变为未定义。

也就是说,完成pointerizeptr_A不再是定义的关联状态。在打印语句中引用此指针是不允许的。

为了兴趣,

Runtime Error: aaa.f90, line 9: Reference to dangling pointer PTR_A 
Target was RETURNed from procedure POINTERIZATION:POINTERIZE 
Program terminated by fatal error 
Abort (core dumped) 

与nagfor结果编译但同样,只是因为指针协会是不确定的,这并不意味着你不能得到你所期望的结果。这样的检查对于编译器来说是一件好事,但它不一定要失败。

+1

如果您想使用过程将指针与变量相关联,最好的方法是使用F08的自动定位功能。您可以将虚拟变量'tab'定义为:'integer,pointer,intent(in):: tab(:)'。这样你可以强制你的变量'A'具有目标属性,限制了具有未定义指针的可能性。 –