跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris Studio 12.3:Fortran 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
4. Solaris Studio Fortran 的功能与扩展
4.4 STRUCTURE 和 UNION (VAX Fortran)
4.6.10 Fortran 2003 FLUSH I/O 语句
4.6.11 Fortran 2003 POINTER INTENT 功能
4.6.12 Fortran 2003 中增强的数组构造函数
4.6.14 其他 Fortran 2003 和 Fortran 2008 功能
Cray 指针是一个变量,其值是另一个实体(称为指针对象)的地址。
f95 支持 Cray 指针;标准 Fortran 95 不支持。
Cray POINTER 语句采用以下格式:
POINTER ( pointer_name, pointee_name [array_spec] ), …
其中,pointer_name、pointee_name 和 array_spec 如下所示:
指向相应 pointee_name 的指针。
pointer_name 包含 pointee_name 的地址。必须是一个标量变量名称(但不是派生类型)。不能是常量、结构名称、数组或函数。
指向相应 pointer_name 的指针对象
必须是: 变量名、数组声明符或数组名称
如果 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) 维数组。
通过将变量与存储块中的特定位置动态关联起来,您可以使用指针访问用户管理的存储。
Cray 指针允许访问绝对内存地址。
POINTER ( pointer_name, pointee_name [array_spec] )
Fortran 95 指针声明如下:
POINTER object_name
不能混用这两种类型的指针。
无论何时引用指针对象,f95 均使用当前的指针值作为指针对象的地址。
Cray 指针类型语句声明指针和指针对象。
Cray 指针为 Cray 指针类型。
在 32 位处理器中,Cray 指针的值占用一个存储单元;在 64 位处理器中,Cray 指针的值占用两个存储单元。
Cray 指针可以出现在 COMMON 列表中,也可以作为哑元参数。
在定义 Cray 指针的值之前,Cray 指针对象没有地址。
如果将数组命名为指针对象,则该数组称为指针对象数组。
其数组声明符可以出现在:
单独的类型语句
单独的 DIMENSION 语句中
指针语句本身
如果数组声明符在子程序中,则维数赋值可以引用:
COMMON 块中的变量或
作为哑元参数的变量
每个维的大小是在进入子程序时计算的,而不是在引用指针对象时计算的。
pointee_name 不得是类型为 CHARACTER*(*) 的变量。
如果 pointee_name 是数组声明符,则它必须是显形(常量或非常量边界)或假定大小。
不允许使用 Cray 指针数组。
Cray 指针不能:
是由另一个 Cray 指针或 Fortran 指针指向的指针。
是结构的组件。
声明为任何其他数据类型。
Cray 指针不能出现在:
PARAMETER 语句或包含 PARAMETER 属性的类型声明语句中。
DATA 语句中。
Cray 指针对象不能出现在 SAVE、DATA、EQUIVALENCE、COMMON 或 PARAMETER 语句中。
Cray 指针对象不能是哑元参数。
Cray 指针对象不能是函数值。
Cray 指针对象不能是结构或结构组件。
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 的后面
a、b 和 c 与 pool 相关联
word64 与 blk(17) 相同,因为 Cray 指针是字节地址,而且 blk 的每个整数元素都是 4 字节长