【问题标题】:User-defined operators in FortranFortran 中的用户定义运算符
【发布时间】:2013-11-18 17:33:03
【问题描述】:

我有一个关于在 Fortran 中编程用户定义运算符的正确方法的问题。更具体地说,我将提供我的问题的示例。我正在为名为“粒子”的球形粒子创建用户定义的数据类型。我想定义一个运算符,它采用现有的 Particle 对象数组并向其中添加一个新的 Particle 对象。我想知道如何定义用户定义的运算符来执行这样的操作。

目前,在 Particle 的类型定义中,我有以下几行:

procedure, public:: addNewParticleTo
generic:: operator(.spawn.) => addNewParticleTo

接下来,我有一个子程序,定义如下:

subroutine addNewParticleTo(a_LHS, a_RHS)
  implicit none
  class(Particle), dimension(:), allocatable, intent(in):: a_LHS
  class(Particle), dimension(:), allocatable, intent(inout):: a_RHS
  <rest of the code>
end subroutine addNewParticleTo

我打算将运算符调用为:

particle .spawn. particleArray

我想知道这是否是这样做的正确方法。对此的任何建议或建议都会非常有帮助。

【问题讨论】:

  • 我的印象是operator 需要function,而不是subroutine
  • 您能否建议我如何定义相应的函数来定义这样的运算符?我想我之前已经使用过这样的构造来重载赋值运算符来创建复制构造函数 - 我在那里使用过子例程。
  • 您应该能够通过简单地将subroutinefunction 交换然后使用NewparticleArray = particle .spawn. OldparticleArray 来做到这一点。

标签: fortran user-defined-functions fortran90 user-defined-types fortran95


【解决方案1】:

要扩展 cmets,您需要将 operator 代码作为 function。此外,每个输入都需要为intent(in)。这确实允许array = particle .spawn. array 之类的东西。

但是,您的子例程需要进行另一项更改:您的参数之一应该是标量。 [第一个,除非你玩pass属性。]

function addNewParticleTo(A, B) result(C)
  class(particle), intent(in) :: A
  class(particle), allocatable, intent(in)  :: B(:)
  class(particle), allocatable :: C(:)
  ! ... code to do the appending
end function

最后,我的建议是,将其用作类型绑定运算符会使事情变得相当复杂,包括多态性等等。另外,array = particle .spawn. array 似乎很不直观。

相反,只是一个简单的子例程,以便call add_to_particle_array(all_particles, new_particle) 的工作看起来更干净。这更接近您的原始代码,但不能回答您关于运算符的问题,唉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2019-07-20
    相关资源
    最近更新 更多