http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54788



--- Comment #4 from Sylwester Arabas <slayoo at staszic dot waw.pl> 2012-10-03 
10:45:10 UTC ---

Thanks for your replies!



I've managed to get a vector of array pointers employing one more intermediate

derived type. The arrvec_t defined below has also some limited support for

negative indexing as in Python:







module arrvec_m

  implicit none



  type :: arr_t

    real, pointer :: a(:,:)

  end type



  type :: arrptr_t

    class(arr_t), pointer :: p

  end type



  type :: arrvec_t

    class(arrptr_t), pointer :: at(:)

    logical, pointer :: inited(:)

    contains

    procedure :: ctor => arrvec_ctor

    procedure :: init => arrvec_init

    procedure :: dtor => arrvec_dtor ! waiting for FINAL

  end type



  contains



  subroutine arrvec_ctor(this, n)

    class(arrvec_t) :: this

    integer, intent(in) :: n



    allocate(this%at(-n:n-1))

    allocate(this%inited(0:n-1))

    this%inited = .false.

  end subroutine



  subroutine arrvec_init(this, n, i_min, i_max, j_min, j_max)

    class(arrvec_t) :: this

    integer, intent(in) :: n, i_min, i_max, j_min, j_max



    allocate(this%at(n)%p)

    allocate(this%at(n)%p%a(i_min : i_max, j_min : j_max))

    this%inited(n) = .true.

    this%at(n - size(this%inited))%p => this%at(n)%p

  end subroutine



  subroutine arrvec_dtor(this)

    class(arrvec_t) :: this

    integer :: i



    do i = 0, size(this%inited) - 1

      if (this%inited(i)) then

        deallocate(this%at(i)%p%a)

        deallocate(this%at(i)%p)

      end if

    end do

    deallocate(this%at)

  end subroutine

end module







program test_arrvec

  use arrvec_m

  class(arrvec_t), pointer :: psi



  allocate(psi)

  call psi%ctor(2)

  call psi%init(0, 0, 3, 0, 4)



  print*, psi%at(0)%p%a

  print*, psi%at(0)%p%a(1,1)

  psi%at(0)%p%a(1,1) = 10

  print*, psi%at(0)%p%a(1,1)

  print*, psi%at(-2)%p%a(1,1)



  call psi%dtor

  deallocate(psi)

end

Reply via email to