Правильный способ передачи указателей на многие подпрограммы

Я не очень хороший программист, и я просто пытаюсь взаимодействовать с моделью, которая предоставляет данные в виде указателей. Эти указатели передаются через несколько подпрограмм, прежде чем данные записываются в них. Я не уверен, как это сделать, чтобы избежать утечек памяти.

Допустим, у меня есть указатель массива 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 ответ

Решение

Обратите внимание, что ваш код не Fortran 90. intent атрибут для фиктивных (формальных) аргументов, которые являются указателями, был введен в Fortran 2003.

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, возвращающей неправильные значения

Другие вопросы по тегам