Fortran 派生类型 : Overloaded assignment operator not working with 'PARAMETER' attribute

标签 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

  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/

相关文章:

haskell - 构造函数中的不可见/隐藏字段

c++ - C++ 和混合编程中指针的默认参数

c++ - 疯狂的 Mac 动态库(可能仅限 Fortran)

fortran - 使用 FFTW3 库评估 FORTRAN 中高斯函数的快速傅里叶变换

arrays - Fortran 中模块或主程序数组必须具有常量形状错误

fortran - 复制 MPI 派生类型与将一种类型设置为等于另一种类型

c# - 如何将父类引用的子类更改为具有子类的引用类型?

fortran - UDDTIO读取​​: pointer being freed was not allocated

c++ - 符号查找错误 : _FileName_: undefined symbol: _intel_fast_memmove