[log in to unmask] wrote:
>
> 2) The result is an array:
> integer, dimension(2) :: B
> B = MYPACK(A, Mask)
>
> This is valid FORTRAN. However, MYPACK had to allocate an array to
> hold the result. That result is then copied into the user array B.
> The memory that was allocated inside MYPACK is lost.
I still believe, the compiler should take care of that pointer function
if an assignment action has been done by the compiler.
The following solution should work for case 2. You might even expand it
to all arithematic operations with the function, if you don't care to
define all operators youself, to make it as applicable as PACK().
Jing
module m_pfun
type rank1fun ! only for function definitions
real,pointer,dimension(:) :: p
end type rank1fun
interface assignment(=); module procedure aeqp; end interface
contains
subroutine aeqp(a,h)
real,dimension(:),intent(out) :: a
type(rank1fun),intent(in) :: h
a(:)=h%p(:)
deallocate(h%p)
print*,'dealloc'
end subroutine aeqp
function pfun(n)
type(rank1fun) :: pfun
print*,'alloc'
allocate(pfun%p(n))
pfun%p(:)=(/(i-1,i=1,n)/)
end function pfun
end module m_pfun
program test
use m_pfun
real,dimension(3) :: a
a=pfun(size(a))
print*,a
end program test
--
________________________________ _-__-_-_ _-___---
Jing Guo, [log in to unmask], (301)805-8333(o), (301)805-7960(fx)
Data Assimilation Office, Code 910.3, NASA/GSFC, Greenbelt, MD 20771
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|