Fortran中=>(等于大于)意味着什么?

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声明,模块实体abb本地名称ccc.

指针初始化

指针初始化很像=>出现的指针赋值.指针初始化定义指针的初始指针关联.我们在诸如的陈述中看到了这一点

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 typeselect 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)

这些关联与指针不同. aassociate块中不需要(并且在上面的例子中不是)变量.


[1] 运算符的概念在Fortran语言中精确定义,例如Fortran 2008规范的3.2.4.与许多其他语言不同,赋值(with =)本身不是一个操作,而是一个语句.在类C语言中,我们可以使用(a=b)返回结果的表达式:Fortran中不是这种情况.这同样适用于Fortran中的指针赋值.上述其他案例完全不同于这种分配理念.在Fortran中,即使=出现在初始化中也与赋值不同. =>不能被视为具有一种效果.


Riv*_*ver 8

令人惊讶的是,搜索"等于箭头符号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指针的一般文档