【发布时间】:2013-12-02 15:42:27
【问题描述】:
我正在尝试使用 fortran 2003 实现一个多项式类,该类具有重载的算术运算和赋值。派生类型维护术语定义和系数的可分配列表,如下所示
type polynomial
private
type(monomial),dimension(:),allocatable :: term
double precision,dimension(:),allocatable :: coef
integer :: nterms=0
contains
...
end type polynomial
interface assignment(=)
module procedure :: polynomial_assignment
end interface
...
contains
elemental subroutine polyn_assignment(lhs,rhs)
implicit none
type(polynomial),intent(???) :: lhs
type(polynomial),intent(in) :: rhs
...
我必须将其设为元素,因为它旨在用作多项式矩阵。至少在大多数情况下,这确实有效。然而,我不知何故让自己对这里的自我分配感到担忧。可以简单地检查指针以查看 C++ 中的情况是否相同,但在 Fortran 中似乎不是一种选择。但是编译器确实检测到了自赋值并给了我一个警告。 (gfortran 4.9.0)
当我有 lhs 的 intent(out) 时,lhs 和 rhs 的可分配条目似乎在进入子例程时被释放,这是有道理的,因为它们都是 p 和意图(out) 论证将首先被定稿。
然后我尝试通过意图(inout)避免释放,并通过修改 lhs 输出中的一个字段来检查自分配
elemental subroutine polyn_assignment(lhs,rhs)
implicit none
type(polynomial),intent(inout) :: lhs
type(polynomial),intent(in) :: rhs
lhs%nterms=rhs%nterms-5
if(lhs%nterms==rhs%nterms)then
lhs%nterms=rhs%nterms+5
return
end if
lhs%nterms=rhs%nterms
嗯,现在这让我感到惊讶。当我这样做时
p=p
它没有进行测试并继续进行,给了我一个 0 项但没有内存违规的多项式。迷糊了,我在assignment里面打印了lhs%nterms和rhs%nterms,结果发现它们是不一样的!
更令人困惑的是,当我对
做同样的事情时call polyn_assignment(p,p)
它完美地工作并且检测到两个参数是相同的。我很困惑子程序的接口如何与子程序本身不同。
我错过了 Fortran 2003 中的分配有什么特别之处吗?
(第一次在这里提问。如果我做得不对,请纠正我。)
【问题讨论】:
标签: operator-overloading fortran assignment-operator