【问题标题】:Using move_alloc in a derived type在派生类型中使用 move_alloc
【发布时间】:2015-06-18 08:52:30
【问题描述】:

我已经编写了一个存储多维数组的派生类型。该数组将从文件中读取到数组b。然后我想使用成员ab 转移到派生类型Space。 mvalloc 的优点是不必分配两个可能会产生内存问题的大型数组。

当我编译代码时出现错误

Call Move_Alloc (b, t% a)
               1
Error: 'from' argument of 'move_alloc' intrinsic 
at (1) must be ALLOCATABLE

类型定义及相关子程序如下

Type, Public :: Space

  Character (Len=65) :: nm
  Real, Allocatable :: a(:,:,:) 

  Contains
    Procedure :: mvalloc => space_mvalloc

End Type Space


Subroutine space_mvalloc (t, b)

  Class (Space), Intent (InOut) :: t
  Real, Intent (InOut) :: b(:,:,:)

  Call Move_Alloc (b, t% a)

End Subroutine space_mvalloc

【问题讨论】:

    标签: fortran alloc derived-types


    【解决方案1】:

    正如错误消息所说,move_alloc 的参数必须是可分配的。这就是他们俩。 from 是第一个,它必须是可分配的,分配才能从它移出。

    你有

    Subroutine space_mvalloc (t, b)
    
      Class (SField), Intent (InOut) :: t
      Real, Intent (InOut) :: b(:,:,:)
    
      Call Move_Alloc (b, t% a)
    End Subroutine space_mvalloc
    

    b 这里不可分配。您应该添加该属性,并确保传入的实际参数是可分配的。

    在调用move_alloc b 和相应的实际参数后,将被取消分配。

    【讨论】:

    • 我明白了。当一个人在子例程中声明一个参数为可分配的时,会有什么影响。当我不使用可分配属性时,可能有什么不同?
    • 这有点太多了,无法在评论中解决,但有三个要点:调用者需要一个显式接口(无论如何,这里都需要假设形状的假人);实际/有效参数必须是可分配的;数组的边界被传递。 [其他情况也适用。]“如果你不这样做”有一个简单的答案:你不能使用move_alloc
    • 是不是因为我要做一些与它的分配状态相关的事情——重新分配,解除分配?
    • 是的,您正在“移动”分配。这样做的效果是第二个参数(如果需要,首先释放)分配为第一个参数并采用第一个参数的值。然后第一个变得未分配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多