Oracle® Developer Studio 12.5:Fortran 用户指南

退出打印视图

更新时间: 2016 年 6 月
 
 

4.3 Cray 指针

Cray 指针是一个变量,其值是另一个实体(称为指针对象)的地址。

f95 支持 Cray 指针;标准 Fortran 95 不支持。

4.3.1 语法

Cray POINTER 语句采用以下格式:

POINTER  ( pointer_name, pointee_name [array_spec] ), …

其中,pointer_namepointee_namearray_spec 如下所示:

pointer_name

指向相应 pointee_name 的指针。

pointer_name 包含 pointee_name 的地址。必须是一个标量变量名称(但不是派生类型)。不能是常量、结构名称、数组或函数。

pointee_name

指向相应 pointer_name 的指针对象

必须是: 变量名、数组声明符或数组名称

array_spec

如果 array_spec 存在,则它必须是显形(常量或非常量边界)或者假定大小。

例如,可以声明指向两个指针对象的 Cray 指针:

    POINTER ( p, b ),  ( q, c )

以上示例声明 Cray 指针 p 及其指针对象 b 以及 Cray 指针 q 及其指针对象 c

还可以声明指向数组的 Cray 指针:

     POINTER ( ix, x(n, 0:m) )

以上示例声明 Cray 指针 ix 及其指针对象 x;并将 x 声明为 n x (m+1) 维数组。

4.3.2 Cray 指针的用途

通过将变量与存储块中的特定位置动态关联起来,您可以使用指针访问用户管理的存储。

Cray 指针允许访问绝对内存地址。

4.3.3 声明 Cray 指针和 Fortran 95 指针

Cray 指针声明如下:

POINTER ( pointer_name, pointee_name [array_spec] )

Fortran 95 指针声明如下:

POINTER object_name

不能混用这两种类型的指针。

4.3.4 Cray 指针的功能

  • 无论何时引用指针对象,f95 均使用当前的指针值作为指针对象的地址。

  • Cray 指针类型语句声明指针和指针对象。

  • Cray 指针为 Cray 指针类型。

  • 在 32 位处理器中,Cray 指针的值占用一个存储单元;在 64 位处理器中,Cray 指针的值占用两个存储单元。

  • Cray 指针可以出现在 COMMON 列表中,也可以作为哑元参数。

  • 在定义 Cray 指针的值之前,Cray 指针对象没有地址。

  • 如果将数组命名为指针对象,则该数组称为指针对象数组

    其数组声明符可以出现在:

    • 单独的类型语句

    • 单独的 DIMENSION 语句中

    • 指针语句本身

    如果数组声明符在子程序中,则维数赋值可以引用:

    • COMMON 块中的变量或

    • 作为哑元参数的变量

    每个维的大小是在进入子程序时计算的,而不是在引用指针对象时计算的。

4.3.5 Cray 指针的限制

  • pointee_name 不得是类型为 CHARACTER*(*) 的变量。

  • 如果 pointee_name 是数组声明符,则它必须是显形(常量或非常量边界)或假定大小。

  • 不允许使用 Cray 指针数组。

  • Cray 指针不能:

    • 是由另一个 Cray 指针或 Fortran 指针指向的指针。

    • 是结构的组件。

    • 声明为任何其他数据类型。

    Cray 指针不能出现在:

    • PARAMETER 语句或包含 PARAMETER 属性的类型声明语句中。

    • DATA 语句中。

4.3.6 Cray 指针对象的限制

  • Cray 指针对象不能出现在 SAVEDATAEQUIVALENCECOMMONPARAMETER 语句中。

  • Cray 指针对象不能是哑元参数。

  • Cray 指针对象不能是函数结果变量。

  • Cray 指针对象不能是结构名称或结构组件。

  • Cray 指针对象不能是可终结型。

4.3.7 Cray 指针的用法

可以将 Cray 指针赋值如下:

  • 设置为绝对地址

    示例:q = 0

  • 赋值给整数变量、加或减表达式或从整数变量、加或减表达式中赋值

    示例:p = q + 100

  • Cray 指针不是整数。不能将它们赋值给实数变量。

  • LOC 函数(非标准)可用于定义 Cray 指针。

    示例: p = LOC( x )

示例: 按上述方式使用 Cray 指针。

    SUBROUTINE  sub ( n )
    COMMON pool(100000)
    INTEGER blk(128), word64
    REAL a(1000), b(n), c(100000-n-1000)
    POINTER ( pblk, blk ), (ia, a ), ( ib, b ), &
            ( ic, c ), ( address, word64 )
    DATA address / 64 /
    pblk = 0
    ia = LOC( pool )
    ib = ia + 4000
    ic = ib + n
    ...

有关以上示例的说明:

  • word64 引用绝对地址 64 的内容

  • blk 是占用内存前 128 个字的数组

  • a 是块公用区中长度为 1000 的数组

  • b 跟在 a 的后面,其长度为 n

  • c 跟在 b 的后面

  • abcpool 相关联

  • word64blk(17) 相同,因为 Cray 指针是字节地址,而且 blk 的每个整数元素都是 4 字节长