4.7 指针和目标上的约束 BACKWARD FORWARD


如果在引用过程P时:(a)一个哑参具有TARGET属性,且(b)相应的实参也具有TARGET属性同时不是一个具有向量下标的数组区域(因此是一个对象A或数组A的一个区域),则程序不符合HPF标准,除非:

 1.调用过程中对实参不进行重映射;或

 2.程序执行的剩余部分将不受影响,如果

  (a)P执行过程中同哑参的任一部分或A的任一部分相关联的每一个指针在退出P时获得未定义的指针关联状态;且

  (b)调用前同A的任一部分相关联的每个指针在进入P时获得未定义的指针关联状态,如果P执行过程中未对该指针重赋值,则退出时将重新存回进入前所具有的指针关联状态。

注意,如果一个哑参具有TARGET属性并且没有显式映射属性,则隐含地假定它具有INHERIT属性(见4.4.2节);因此这种哑参不会发生重映射且没有任何问题。

基本原理:建立这些约束是为了在面对跨越子程序接口的隐式重映射时支持Fortran标准的下列部分(在该文档的12.4.1.1节中):

如果哑参不具有TARGET或POINTER属性,则与实参相关联的任何指针在引用过程时都不会相应的哑参相关联。如果哑参具有TARGET属性且相应的实参也具有TARGET属性但不是一个具有向量下标的数组区域:

 1.与实参相关联的任何指针在引用过程时变得与相应的哑参相关联。

 2.当过程执行完成时,与哑参相关联的任何指针保持与实参相关联。

如果哑参具有TARGET属性且相应的实参不具有TARGET属性或是一个具有向量下标的数组区域,则当过程执行完成时,与哑参相关联的任何指针变成未定义的。(基本原理结束)

4.7.1 例子

这里的例子阐述了本节的约束:

     INTEGER, TARGET, DIMENSION(10) :: ACT
     INTEGER, POINTER, DIMENSION(:) :: POINTS_TO_ACT, POINTS_TO_DUM
 !HPF$  DISTRIBUTE ACT(BLOCK)

     POINTS_TO_ACT=>ACT
     CALL F(ACT)
     POINTS_TO_DUM(1)=1   !不合法

     CONTAINS
      SUBROUTINE F(DUM)
       INTEGER, TARGET, DIMENSION(10) :: DUM
      !HPF$ DISTRIBUTE DUM(CYCLIC)

      POINTS_TO_DUM=>DUM
      POINTS_TO_ACT(1)=1  !不合法
     END SUBROUTINE
    END

对POINTS_TO_DUM(1)的赋值是不合法的,这是因为它违反了条款2a;对POINTS_TO_ACT(1)的赋值是不合法的,这是因为它违反了条款2b;


Copyright: NPACT BACKWARD FORWARD