将指针传递给许多子例程的正确方法

时间:2016-11-17 13:57:23

标签: fortran fortran90 intel-fortran

我不是一个非常优秀的程序员,我只是尝试与提供数据作为指针的模型进行交互。在将数据写入它们之前,这些指针会向下传递几个子例程。我不知道该怎么做才能避免内存泄漏。

让我们说我有一个数组指针A,在写入之前传递给几个子程序,如何处理声明,分配和解除分配?

module data

implicit none
contains 

subroutine s1(a)
real, pointer, intent(out) :: a(5,5)

call s2(a)
end subroutine s1

subroutine s2(a)
real, pointer, intent(out) :: a(5,5)
integer :: i 

do i = 1,5 
  a(:,i) = 5.0
end do
end subroutine s2
end module data

Program test
use data, only : s1, s2
real, pointer, dimension(:,:) :: A => NULL()
allocate(A(5,5))
call s1(A)
write(*,*) A
deallocate(A)
end Program test

1 个答案:

答案 0 :(得分:1)

请注意,您的代码不是Fortran 90.在Fortran 2003中引入了作为指针的虚拟(正式)参数的intent属性。

intent指的是指针的关联状态,而不是指针的关联状态。此外,如果参数是派生类型 指针组件,intent适用于类型对象本身,而不是指针的目标。也就是说,例如,如果使用intent(in),则可以修改指针所针对的数据区域:

module MyType_mod

  implicit none
  private

  type, public :: MyType
     integer, pointer :: ptr(:)
   contains
     procedure :: sub => my_type_sub
  end type MyType

contains

  subroutine my_type_sub(self)
    ! Dummy argument
    class(MyType), intent(in) :: self

    ! The following is perfectly legal,
    ! even though intent(in) was specified
    self%ptr = 42

  end subroutine my_type_sub

end module MyType_mod

program main

  use MyType_mod, only: &
       MyType

  implicit none

  type(MyType) :: foo
  integer      :: alloc_stat

  allocate( integer :: foo%ptr(100), stat=alloc_stat )
  call foo%sub()

end program main

尽管不是必需的,但在上一个例子的情况下,最好陈述intent(inout)以向读者表明正在进行数据修改。

另外,您可能会发现此答案有用Fortran subroutine returning wrong values