【问题标题】:Overload arrow operator (=>) in fortranfortran 中的重载箭头运算符 (=>)
【发布时间】:2019-07-20 13:53:20
【问题描述】:

我刚开始在 Fortran 2003 中重载运算符(包括赋值),我想为我的用户定义类型重载箭头运算符 (=>)。 我知道对于大多数运算符,比如 (+),我会说

interface operator(+)  
    ! What I want this to mean instead  
end interface operator

但是,这不适用于 (=>)。我知道分配,我会说

interface assignment(=)  
    ! What I want this to mean instead  
end interface assignment

这仍然不适用于 (=>)。

具体来说,我定义了一个基础数据是指针的类型。

type my_type
    integer, pointer :: data(:)
end type my_type

所以,当我说

type (my_type) :: a
integer, target :: b(4)

! Do stuff to b
a => b

我想说的是

a%data => b

感谢您的任何建议! 2003 标准以外的标准中的答案也会有所帮助。

【问题讨论】:

  • 谢天谢地,您似乎无法为所欲为。在你上面的例子中,如果声明是type(my_type), pointer :: aa => b 是什么意思?这是语法错误吗?
  • 请注意=> isn't an operator。这里的问题涉及= 不是运算符,因此值得强调的是指针赋值也不是一个运算符。
  • @Steve 我希望在我对答案的评论中引用你。有兴趣的请看下文。我习惯于在 C++ 中显式取消引用指针,所以您的评论肯定有助于我更好地理解 Fortran。
  • @francescalus 感谢您让我意识到在 Fortran 中没有赋值被视为运算符。这很有意义,为什么我不能进行链式分配,因为它们不返回任何东西。

标签: pointers fortran operator-overloading overloading


【解决方案1】:

在 Fortran 2018 中无法重载指针分配。

This question 询问有关使用类型绑定过程来处理重载的问题,但在更一般的意义上,答案仍然是否定的。

直到Fortran 2018,指针赋值语句的含义

a => b

总是影响左侧指针a的指针状态。

虽然 Fortran 标准有 intrinsicdefined 赋值(后者在 interface assignment(=) 中引入),但指针赋值没有这种区别。

【讨论】:

  • 那么,您是说这在 2018 年标准中可用,还是仍然不可用?这对我来说似乎有点不清楚。如果是这样,请继续阅读:@Steve 对我的问题的回复提到了编译器如何不知道如何处理它,这让我意识到如果没有显式的指针取消引用运算符,这是没有意义的。如果我有type (my_type), pointer :: a 然后说a=>b,是a 被修改为指针,还是底层对象被修改? (我承认我是 C++ 用户,所以如果我的 Fortran 词汇似乎有问题/错误,我深表歉意。)
  • 只是一个评论,因为您来自 C++ 背景:指针是 Fortran 中的最后手段,您通常使用其他方式来达到目的。这与 C 语言家族完全不同。所以也许如果你说出你真正想做的事情,我们可以看到一种更 Fortran 的方式。
  • @madoflancashire,在 Fortran 中,当指针出现在某处时,通常会使用指针的 target(即,指针通常被取消引用)。对于像a=>b 这样的指针分配,指针a 的指针关联会发生变化。稍后的引用,如 a%x 将指向 b%x
  • 听听伊恩布什的建议。 Fortran 指针与 C/C++ 指针不同。 Fortran 指针确实在语言中占有一席之地,但如果你能避免它们,那就去做吧。
  • @IanBush 我需要能够为数据加上别名,可能还有很多,并且可能在任何给定时刻 3 次以上。一切都保持不变,所以我不必担心内存危害。但是,我想通过多重锯齿而不是直接复制来节省内存。因此,我想到了指针,因为我可以随意分配或分配它们。我调用的函数接收的不是矩阵,而是数组数组,因为我想分别为每个子数组设置别名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2012-05-27
  • 2012-04-19
相关资源
最近更新 更多