Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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 具有重载分配的LHS自动再分配_Fortran_Fortran2003_Fortran2008 - Fatal编程技术网

Fortran 具有重载分配的LHS自动再分配

Fortran 具有重载分配的LHS自动再分配,fortran,fortran2003,fortran2008,Fortran,Fortran2003,Fortran2008,我有一个代码,当在LHS上使用RHS上的结构构造函数对未分配的可分配对象进行赋值时,它会将我手头的所有编译器都划分为错误。结构(派生类型)本身具有重载赋值。我认为,LHS的自动重新分配应该在调用赋值例程之前发生,但事实似乎并非如此 下面是代码,演示问题。取消对allocate语句的注释可以使一切正常工作,但我不理解为什么在这种情况下需要显式分配。有趣的是,如果我删除超负荷的任务,事情也会顺利进行 有什么提示吗 module dummy implicit none type :: Dum

我有一个代码,当在LHS上使用RHS上的结构构造函数对未分配的可分配对象进行赋值时,它会将我手头的所有编译器都划分为错误。结构(派生类型)本身具有重载赋值。我认为,LHS的自动重新分配应该在调用赋值例程之前发生,但事实似乎并非如此

下面是代码,演示问题。取消对allocate语句的注释可以使一切正常工作,但我不理解为什么在这种情况下需要显式分配。有趣的是,如果我删除超负荷的任务,事情也会顺利进行

有什么提示吗

module dummy
  implicit none

  type :: DummyType
    integer :: ii
  contains
    procedure :: assignDummyType
    generic :: assignment(=) => assignDummyType
  end type DummyType

  interface DummyType
    module procedure DummyType_init
  end interface DummyType

contains

  function DummyType_init(initValue) result(this)
    integer, intent(in) :: initValue
    type(DummyType) :: this
    this%ii = initValue
  end function DummyType_init

  subroutine assignDummyType(this, other)
    class(DummyType), intent(out) :: this
    type(DummyType), intent(in) :: other
    this%ii = other%ii + 1
  end subroutine assignDummyType
end module dummy

program test_dummy
  use dummy
  implicit none

  type(DummyType), allocatable :: aa

  !allocate(aa)   ! Should be covered via automatic reallocation...
  aa = DummyType(42)

end program test_dummy
关于这个话题,有一个很好的解释

赋值语句可以是内在赋值,也可以是定义的赋值。内部分配允许[重新]分配左侧,但定义的分配不允许


当您提供分配通用标识符的过程时,您的分配被定义为分配。与左手边相对应的参数的特征要求分配左手边。

没有查看代码,但是您有什么版本的编译器?其中一些包括了自动重新分配,有点晚了。最近的是GNU、Intel和NAG。但很明显,这似乎是标准的问题,而不是编译器的问题,正如下面IanH所解释的。如果你能添加一个链接,那就太好了。@IanH哦,我明白了,谢谢!这意味着,如果使用库提供的类型,如果希望将该类型分配给一个可分配类型而不显式分配,则必须了解该类型的实际实现(无论该分配是否被重写)。我不觉得这很直观。。。我也很感激,如果您可以提供关于COMP.Lang.FoTrand的讨论的链接。那么,为了您的库的用户,考虑在其他类型的客户端中需要定义的赋值的包装类型。