4.7 指针和目标上的约束 |
如果在引用过程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属性或是一个具有向量下标的数组区域,则当过程执行完成时,与哑参相关联的任何指针变成未定义的。(基本原理结束)
这里的例子阐述了本节的约束:
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 |