gpt4 book ai didi

operator-overloading - 在 Fortran 重载赋值中检查自赋值

转载 作者:行者123 更新时间:2023-12-04 00:39:50 30 4
gpt4 key购买 nike

我正在尝试使用 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
...

我必须将其设为元素,因为它旨在用作多项式矩阵。这确实有效,至少在大多数情况下是这样。但是,我不知何故让自己担心这里的 self 分配。可以简单地检查指针以查看 C++ 中的内容是否相同,但它似乎不是 Fortran 中的选项。但是编译器确实检测到自赋值并给了我一个警告。 (gfortran 4.9.0)

当我有 lhs 的 intent(out) 时,lhs 和 rhs 的可分配条目似乎在进入子例程时被释放,这是有道理的,因为它们都是 p,并且是一个意图(out) 参数将首先被确定。

然后我试图用一个意图(inout)来避免释放,并通过修改 lhs 输出中的一个字段来检查 self 分配

   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)

它完美地工作并检测到两个参数是相同的。我很困惑子例程的接口(interface)如何以不同于子例程本身的方式运行。

Fortran 2003 中的赋值有什么我错过的特别之处吗?

(第一次在这里提问,如有不妥请指正)

最佳答案

如果您有一个语句 a = b 通过子例程 sub 调用定义的赋值,赋值语句等同于 call sub(a, (b ))。请注意括号 - 右侧参数是评估括号表达式的结果,因此在概念上与 b 不是同一对象。详情参见 F2008 12.4.3.4.3。

因此,a = a 等同于call sub(a, (a))。这两个参数没有别名。它不同于 call sub(a,a),后者可能(取决于 sub 内部的细节,包括虚拟参数属性)打破 Fortran 的参数别名规则(例如,在您的示例中,诸如 call polyn_subroutine(a,a) 之类的语句是非法的)。

关于operator-overloading - 在 Fortran 重载赋值中检查自赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20065596/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com