Generics Fortran命名运算符
我编写了一个派生类型,并为其定义了一个命名运算符,如下所示:Generics Fortran命名运算符,generics,fortran,operator-overloading,intel-fortran,named,Generics,Fortran,Operator Overloading,Intel Fortran,Named,我编写了一个派生类型,并为其定义了一个命名运算符,如下所示: module ModuleNamedOperator implicit none type TCoords contains procedure :: TCoordsFM generic,public :: operator(.fm.) => TCoordsFM end type contains type(TCoords) function TCoordsFM(self,
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)
我认为您遇到了一个
ifort
编译器错误,请参阅。当将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
如果你的意思是
1
,那么这不是一个命名常量,而是一个文字常量。为什么看起来像?你收到消息了吗?@Vladimir F.我已经添加了消息。还有一件事。如果我重载一个内在操作符而不是定义一个命名操作符,那么一切都正常。对于exmaple,如果我声明generic,public::operator(>)=>TCoordsFM
而不是generic,public::operator(.fm.)=>TCoordsFM
,那么像a=a>I>1
这样的代码就可以了。您可以尝试添加括号来引导编译器按照执行顺序运行。。。在我看来,它似乎是在尝试评估(i.fm.1)
,而这并没有定义。