Riv*_*ver 9 fortran pointers variable-assignment fortran90
我正在查看一些旧的Fortran 90代码并且遇到了=>
符号:
var => item
Run Code Online (Sandbox Code Playgroud)
看起来它被用于某种任务.
搜索谷歌"箭头符号Fortran"或"等于大于符号Fortran"给我没有相关材料.
fra*_*lus 20
=>
作为现代Fortran中的一个句法元素出现在六个上下文中,许多(但不是全部)与指针有关:指针赋值 ; 指针初始化 ; 程序(指针)声明 ; 类型约束程序声明 ; 协会 ; 重命名.大多数这些之间有密切的联系.很多时候,很多人=>
可以被视为提供另一种临时或永久的方式来引用另一个实体.但是,没有一个是=>
作为运营商.1
指针赋值是=>
Fortran 90中出现的传统外观之一.它用于将指针与目标相关联,并在另一个答案中进行了解释.
重命名实体使用关联涉及元素=>
,是Fortran 90/95代码中的另一个外观.这样的use
陈述就像
use mod_a, c=>a
use mod_b, only : cc => bb
Run Code Online (Sandbox Code Playgroud)
遵循这样的use
声明,模块实体a
和bb
本地名称c
和cc
.
指针初始化很像=>
出现的指针赋值.指针初始化定义指针的初始指针关联.我们在诸如的陈述中看到了这一点
real, target :: a
real, pointer :: b=>a
real, pointer :: c=>NULL()
Run Code Online (Sandbox Code Playgroud)
使用此显式初始化,b
此处的指针最初与之关联,a
并且指针c
最初未关联.这两种形式在现代Fortran中很有用,因为在Fortran 90中,指针总是从未初始化的未定义关联状态开始.在这里我们知道b
并且c
已经定义了指针关联状态,我们可以使用ASSOCIATED
.
对于派生类型组件,此类语法提供默认初始化
就像=>
定义过程指针的初始关联时数据对象的显式/默认初始化一样.
procedure(proc_interface), pointer :: proc1 => donkey
procedure(proc_interface), pointer :: proc2 => null()
Run Code Online (Sandbox Code Playgroud)
在这里,proc1
最初再次与程序相关联,donkey
我们可以有这样的东西
call proc1(...)
Run Code Online (Sandbox Code Playgroud)
就像在指令语句之外proc1
指定指针一样donkey
. proc2
正如预期的那样,最初没有关联.
与数据对象一样,派生类型的组件=>
可以设置对象绑定过程的初始关联
type a
procedure(proc_interface), pointer :: proc => donkey
end type a
Run Code Online (Sandbox Code Playgroud)
与上述概念上相关的是=>
在声明类型绑定过程中的用法.
type a
contains
procedure :: proc => donkey
generic :: assignment(=) => type_a_eq
end type a
Run Code Online (Sandbox Code Playgroud)
这里的类型a
proc
是绑定名称,因此b%proc
(对于b
类型的实体a
)是过程引用.我们还通过左侧type_a_eq
确定了类型实体的分配a
.
=>
出现在三个关联背景中.的associate
,select type
并select rank
构建一个名字与选择相关联.
从Fortran 2003开始
associate (a => 1+2)
... ! In this block we have an entity named a
end associate
Run Code Online (Sandbox Code Playgroud)
和
class(*) b ! b is unlimited polymorphic
select type (a => b)
type is (real)
... ! a is a non-polymorphic real here
end select
Run Code Online (Sandbox Code Playgroud)
我们在Fortran 2018的(当前草案)中介绍过
dimension(..) b ! b is assumed rank
select rank (a => b)
rank (1)
... ! a is a rank-1 array here
end select
Run Code Online (Sandbox Code Playgroud)
这些关联与指针不同. a
在associate
块中不需要(并且在上面的例子中不是)变量.
[1] 运算符的概念在Fortran语言中精确定义,例如Fortran 2008规范的3.2.4.与许多其他语言不同,赋值(with =
)本身不是一个操作,而是一个语句.在类C语言中,我们可以使用(a=b)
返回结果的表达式:Fortran中不是这种情况.这同样适用于Fortran中的指针赋值.上述其他案例完全不同于这种分配理念.在Fortran中,即使=
出现在初始化中也与赋值不同. =>
不能被视为具有一种效果.
令人惊讶的是,搜索"等于箭头符号Fortran"会产生一些结果.
"=>"通常称为指针赋值运算符.
(虽然它不是真正的运营商,因为它没有返回任何价值.)
它用于将选定的引用名称与目标关联:
reference => target
Run Code Online (Sandbox Code Playgroud)
上述可以读作"参考是指靶向"
大多数情况下,此引用以指针的形式出现.在这种情况下,您可以说" 目标参考点 ".这是一种有用的方法来记住这个操作符的作用,因为它的文字外观是一个从引用到目标的箭头.
进一步使用
其他用途包括为各种项目(如模块组件,过程甚至任意表达式)创建本地别名.有关所有这些用途的完整说明,请参阅此答案.
指针赋值与传统赋值(=)
以下是上述链接的一个简单示例,说明了指针赋值与经典赋值("=")的不同之处.基本上,这表明一旦建立目标,指针就被视为基本语句的目标.
pt => x ! pt points to x
y = pt ! y equals x
pt => y ! pt points to y
pt = 17 ! y equals 17
Run Code Online (Sandbox Code Playgroud)
其他资源:
关于Fortran指针的一般文档