Fortran派生类型:重载赋值运算符不使用';参数';属性
我使用的是派生类型(双复数)和赋值运算符(=)的重载,因此可以将Fortran派生类型:重载赋值运算符不使用';参数';属性,fortran,derived-types,Fortran,Derived Types,我使用的是派生类型(双复数)和赋值运算符(=)的重载,因此可以将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 su
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
分配给具有参数
属性的双复数时会中断:
TYPE(bicomplex) :: test1
test1 = 1.d0
工作正常,但:
TYPE(bicomplex), parameter :: test1 = 1.d0
未编译并给出2个错误:错误:在(1)
处参数中的派生类型不兼容,以及错误:无法在(1)
处将实数(8)转换为类型(双复数)。
但是,
工作完美
是否有我遗漏的东西,或者是标准的一部分,参数不能通过使用重载赋值运算符进行赋值?理想情况下,我希望使用F90/F95(而不是2003或2008)来解决这个问题。我对标准的理解是,这里不能使用定义的运算符。我的想法是,这是因为运算符用于定义赋值,其中使用命名常量初始化(请参阅Fortran 2008的R503和C507,第5.2.1节) 在Fortran 2008第5.2.3节中,关于初始化: 如果初始化为=常量expr,则变量最初由常量expr指定的值定义;如有必要,该值将根据内在赋值规则进行转换 该段落(未显示)中可能存在一些歧义,因为它首先引用的实体没有
参数
属性。因此,在第5.3.13节中查看参数
属性:
TYPE(bicomplex) :: test1
test1 = 1.d0
实体具有由其常量expr指定的值,如有必要,可转换为实体的类型、类型参数和形状
然而,第5.4.11节(对于参数语句)可能强调了这种转换是通过内在赋值实现的:
每个命名常量的值是由相应的常量表达式指定的值;如有必要,该值将根据内在赋值规则进行转换
对于第一个命名常量,没有从内部类型到派生类型的内部赋值。在第二种情况下,使用派生类型的构造函数,确实使用了内部赋值。一个“参数”是一个命名常量。该语言的规则要求命名常量的值可以在“编译时”(即在程序执行之前)确定。这意味着,用于为命名常量提供其值的表达式需要能够在编译时确定。在最近的标准中,这方面的语言术语是“常量表达式”,在早期的标准中,它也被称为“初始化表达式”(可以在程序执行之前用作初始值设定项)
定义的赋值是一个可执行操作-当运行时,程序执行位于定义赋值后面的过程中的语句。这通常不能在编译时完成
正如您所发现的,在组件初始值设定项是常量表达式的情况下,可以使用结构构造函数来初始化名为常量的派生类型。谢谢!因此,如果不使用bicomplex()运算符,就无法创建名为constant的双复数?这太不方便了……这个答案有点混乱和飘忽不定:我会留下我的想法,欢迎评论。弗朗西斯卡勒斯第一次就说对了。初始化中的=不是赋值,它是引入初始化值的语法。在本例中,bicomplex()是一个结构构造函数,实际上在本上下文中没有其他方法来创建该类型的值。我认为它必须是一个函数type(bicomplex)函数dble\u assign\u bicplx(qleft,xright)
,如果定义的赋值是由函数指定的,那么,您将如何控制函数结果对赋值左侧对象的赋值?