将指针传递给许多子程序的正确方法
Proper way to pass pointers into many subroutines
我不是一个很好的程序员,我只是想与一个提供数据作为指针的模型进行交互。在向它们写入数据之前,这些指针通过几个子程序向下传递。我不确定如何执行此操作以避免内存泄漏。
假设我有一个数组指针 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
请注意,您的代码不是 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)
以向 reader 表明正在进行数据修改。
另一方面,您可能会发现此答案很有用
我不是一个很好的程序员,我只是想与一个提供数据作为指针的模型进行交互。在向它们写入数据之前,这些指针通过几个子程序向下传递。我不确定如何执行此操作以避免内存泄漏。
假设我有一个数组指针 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
请注意,您的代码不是 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)
以向 reader 表明正在进行数据修改。
另一方面,您可能会发现此答案很有用