【问题标题】:Fortran named operatorFortran 命名运算符
【发布时间】:2015-03-06 20:31:03
【问题描述】:

我编写了一个派生类型并为它定义了一个命名运算符,如下所示:

module ModuleNamedOperator
  implicit none
  type TCoords
    contains
      procedure :: TCoordsFM
      generic,public :: operator(.fm.) => TCoordsFM
  end type
  contains
    type(TCoords) function TCoordsFM(self,IVal) result(this)
      class(TCoords),intent(in) :: self
      integer(4),intent(in) :: IVal
      this=self
      write(*,'(I0)') "IVal:",IVal
    end function TCoordsFM
end module ModuleNamedOperator

当我尝试在以下代码中使用它时,发生了一些奇怪的事情:

program test
  use ModuleNamedOperator
  implicit none
  type(TCoords) :: a
  integer(4) :: i
  i=1
  a=a .fm. 1              ! Case 1, valid
  a=a .fm. i              ! Case 2, valid
  a=a .fm. 1 .fm. i       ! Case 3, invalid
  a=a .fm. i .fm. 1       ! Case 4, valid
  a=a .fm. 1 .fm. 1       ! Case 5, valid
  a=a .fm. i .fm. i       ! Case 6, invalid
end program test

在案例 3 和案例 6 中,代码无效。看来,如果运算符.fm 的第二个参数。是变量或命名常量,那么会发生错误。那么这些案例是怎么回事呢?有没有出路?如果重要的话,编译器是 ifort_2013_sp1.3.174。 编译器给出以下错误信息:

TestNamedOperator.f90(25): error #6866: Dotted string neither a defined operator nor a structure component   [FM]
  a=a .fm. 1 .fm. i
--------------^
TestNamedOperator.f90(28): error #6866: Dotted string neither a defined operator nor a structure component   [FM]
  a=a .fm. i .fm. i
--------------^
TestNamedOperator.f90(25): error #6303: The assignment operation or the binary expression operation is invalid for the data types of the two operands.
  a=a .fm. 1 .fm. i
-------------^
TestNamedOperator.f90(28): error #6303: The assignment operation or the binary expression operation is invalid for the data types of the two operands.
  a=a .fm. i .fm. i
-------------^
compilation aborted for TestNamedOperator.f90 (code 1)

【问题讨论】:

  • 如果你的意思是1,那么这不是一个命名常量,而是一个literal常量。
  • 为什么会这样?你有收到任何消息吗?
  • @Vladimir F. 我已添加消息。
  • 还有一件事。如果我重载一个内在运算符而不是定义一个命名运算符,那么一切都很好。例如,如果我声明 generic,public :: operator(>) => TCoordsFM 而不是 generic,public :: operator(.fm.) => TCoordsFM ,那么 a=a>i>1 之类的代码就可以了
  • 您可以尝试添加括号以引导编译器执行执行顺序...在我看来,它似乎正在尝试评估未定义的(i .fm. 1)

标签: generics fortran operator-overloading intel-fortran named


【解决方案1】:

我认为您遇到了ifort 编译器错误,请参阅here。将write 语句更改为write(*,'(A,I0)') "IVal:",IVal 时,您的代码可以使用gfortran 正常编译。

对于ifort,显式调用函数会有所帮助:

program test
  use ModuleNamedOperator
  implicit none
  type(TCoords) :: a
  integer(4) :: i
  i=1
  a=a .fm. 1              ! Case 1, valid
  a=a .fm. i              ! Case 2, valid
  a=TCoordsFM((a .fm. 1), i)      ! Case 3, valid
  a=TCoordsFM((a .fm. i), 1)      ! Case 4, valid
  a=TCoordsFM((a .fm. 1), 1)      ! Case 5, valid
  a=TCoordsFM((a .fm. i), i)      ! Case 6, valid
end program test

【讨论】:

    猜你喜欢
    • 2016-10-04
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多