我使用派生类型(双复数)和赋值运算符 (=) 的重载,以便可以将 real*8
分配给 bicomplex
。 bicplx 模块的 MWE 如下:
MODULE bicplx
type bicomplex
COMPLEX*16 :: a
COMPLEX*16 :: b
end type
interface assignment(=)
module procedure dble_assign_bicplx
end interface
contains
subroutine dble_assign_bicplx(qleft, xright)
implicit none
type(bicomplex), intent(out) :: qleft
double precision, intent(in) :: xright
qleft%a = xright
qleft%b = 0.0d0
return
end subroutine dble_assign_bicplx
end MODULE
实数到复数的分配本质上是由 Fortran 处理的。此方法在“典型”双复数变量上使用时效果很好,但当我想将 real*8
分配给具有 PARAMETER
属性的双复数时会中断:
TYPE(bicomplex) :: test1
test1 = 1.d0
工作完美,但是:
TYPE(bicomplex), parameter :: test1 = 1.d0
无法编译并给出 2 个错误:错误: (1) 处的 PARAMETER 中的派生类型不兼容
,以及 错误:无法将 REAL(8) 转换为 TYPE(bicomplex) 处(1)
。
然而,
TYPE(bicomplex), parameter :: test1 = bicomplex(1.d0, 0.d0)
工作完美。
是否有我遗漏的东西,或者它是标准的一部分,不能使用重载的赋值运算符来分配参数?理想情况下,我想使用 F90/F95(而不是 2003 或 2008)来解决这个问题。
最佳答案
“参数”是一个命名常量。该语言的规则要求可以在“编译时”(即在执行程序之前)确定命名常量的值。这意味着用于为命名常量提供其值的表达式需要能够在编译时确定。在最近的标准中,这种情况的语言术语是“常量表达式”,在早期的标准中,它也称为“初始化表达式”(可以在程序执行之前用作初始化程序的东西)。
定义的赋值是一个可执行操作 - 程序运行时执行位于定义的赋值后面的过程中的语句。这通常不是可以在编译时完成的事情。
正如您所发现的,您可以使用结构构造函数(其中组件初始值设定项是常量表达式)来初始化派生类型命名常量。
关于Fortran 派生类型 : Overloaded assignment operator not working with 'PARAMETER' attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25495549/