Fortran:Cray Pointers和派生数据类型

时间:2015-03-23 21:31:53

标签: pointers fortran

我在fortran中有一个派生数据类型,如下所示:

TYPE mytype
        INTEGER a
        DOUBLE COMPLEX, dimension(:), allocatable :: elem
END TYPE mytype

现在我想编写一个函数,它将DOUBLE COMPLEX数组作为参数。该数组应该成为“mytype”的数组“elem”,而不分配内存和复制数据。我尝试以下列方式使用cray指针:

DOUBLE COMPLEX, INTENT(IN) :: eleminput(5) !input array which should become x%elem
TYPE(mytype) :: x
pointer(xpntr,x%elem)
xpntr = LOC(eleminput)

当我尝试编译时,我得到一个错误,说它在“指针(xpntr,x%elem)”行中表示“)”而不是“%”。因此,似乎cray指针不适用于派生数据类型的元素。有没有可能让这个工作或没有cray指针?派生数据类型无法更改。我希望你解开我的问题并感谢你的帮助。

2 个答案:

答案 0 :(得分:3)

您可以移动分配。如果eleminput参数是可分配的:

integer, parameter :: dp = kind(1.0d0)
type mytype
  integer :: a
  complex(kind=dp), dimension(:), allocatable :: elem
end type

...    

subroutine foo(eleminput)
  complex(kind=dp), intent(inout), allocatable :: eleminput(:)
  type(mytype) :: x
  call move_alloc(eleminput, x%elem)
  !...  work with x
end subroutine foo

与可分配的伪参数关联的实际参数本身必须是可分配的 - 也就是说 - 对foo的调用必须类似于:

complex(kind=dp), allocatable :: fred(:)
fred = [(0,0),(0,1),(1,1),(1,0)]
call foo(fred)

因为分配被移出子例程eleminput内的伪参数foo,所以当子例程返回时,实际参数fred将被取消分配。

答案 1 :(得分:2)

Cray指针不能与allocatables一起使用。我建议强烈反对在新代码中使用Cray指针,因为Cray指针在实现细节上略有不同,而且正常的Fortran指针在这里工作:

module bar
  integer, parameter :: dp = selected_real_kind(15)
  TYPE mytype
     INTEGER:: a
     complex(kind=dp), dimension(:), allocatable :: elem
  END TYPE mytype

contains

  subroutine foo(eleminput)
    complex(kind=dp), dimension(:), intent(out), pointer :: eleminput
    type(mytype), target, save : : x
    allocate (x%elem(.....))
    eleminput => x%elem
  end subroutine foo
end module bar