Hi,
I wonder if there exists an easy way to implement a getter function for an array valued attribute?
For instance, one has a derived item, for example the extensions of a process grid (pgrid). As this item can be retrieved lets say from an mpi subroutine using a given communcator, it would be cleaner not to store this informations redundantly:
...
type :: PGRID
integer :: comm
contains
procedure :: psizes => get_psizes
end type PGRID
...
module function get_psizes(this) result(psizes)
class(PGRID), intent(in) :: this
integer :: psizes(2)
end function get_psizes
...
! now if one wants to access 'psizes' like an array,
! that does obviously produce an error because indexing
! is interpreted as a second argument
dim1=pgrid%psizes(1) ! -> error
I have found this more complicated workaraound, so that indexing should work, but I'm not very happy with it:
type :: PGRID
integer :: comm
contains
procedure psizes => get_psizes
end type PGRID
...
interface get_psizes
module function get_psizes_array(this,k) result(psizes)
class(PGRID), intent(in) :: this
integer, optional, intent(in) :: k(:)
integer :: psizes(size(k))
end function get_psizes_array
module function get_psizes_single(this,k) result(psizes)
class(PGRID), intent(in) :: this
integer, optional, intent(in) :: k
integer :: psizes
end function get_psizes_single
end interface get_psizesSo is there any better solution for this problem?
- Thanks in advance