Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran派生类型:重载赋值运算符不使用';参数';属性_Fortran_Derived Types - Fatal编程技术网

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)
,如果定义的赋值是由函数指定的,那么,您将如何控制函数结果对赋值左侧对象的赋值?