(Class-) array finalization and initialization question
Andre Vehreschild
vehre@gmx.de
Wed Feb 18 17:41:00 GMT 2015
Hi Salvatore,
thanks for the feedback. Could you do a test series on what the cray compiler
is doing when:
elemental subroutine fin(x) | subroutine init(x); type(t1),intent(out)::x(:,:)
subroutine fin(x) | subroutine init(x); type(t1),intent(out)::x(:,:)
elemental subroutine fin(x) | elemental subroutine init(x);type(t1),intent(out)::x
I am interest whether there are any differences in the result. I expect for all
cases to deliver the same result, but one never knows. Thanks in advance for
your time and help.
Regards,
Andre
On Wed, 18 Feb 2015 17:07:44 +0100
Salvatore Filippone <filippone.salvatore@gmail.com> wrote:
> Hmm.
> I am sorry, you appear to be right, and the Cray compiler actually
> agrees with you. I was too hasty :(
>
>
> On Wed, Feb 18, 2015 at 5:03 PM, Andre Vehreschild <vehre@gmx.de> wrote:
> > Hi Salvatore,
> >
> > thanks for the quick reply.
> >
> > The cited F2008 standard at the position given says, that any subcomponent
> > provided with a default-initializer is default-initialized. IMHO this does
> > conflict with what you tell me. Or do I misinterpret this fragment:
> >
> > "The INTENT (OUT) attribute for a nonpointer dummy argument specifies that
> > the dummy argument becomes undefined on invocation of the procedure, except
> > for any subcomponents that are default-initialized (4.5.4.6)." (F2008,
> > 5.3.10, §3)
> >
> > and it means that the dummy arguments become undefined, besides all
> > arguments that have subcomponents that are default-initialized don't become
> > undefined. Those remain defined, but are not re-default-initialized? I
> > don't hope the standard is to be interpreted like that. That would be quite
> > unexpected. Which user of Fortran is to understand that, and what is the
> > higher use of it?
> >
> > Regards,
> > Andre
> >
> > On Wed, 18 Feb 2015 16:05:34 +0100
> > Salvatore Filippone <filippone.salvatore@gmail.com> wrote:
> >
> >> >Note the intent(out) here, which is the second crucial point and in
> >> >combination with the call to init() in the main program:
> >> >
> >> > type(t1), allocatable :: x(:,:)
> >> >allocate(t1 :: x(5,5))
> >> >x%i = 1
> >> >call init(x(::2, ::3))
> >> >
> >> >one gets the remarkable result, that now x%i is -13 for the entries
> >> >selected by the strides. My question now is: why are those values -13 and
> >> >not 42 as I would expect from the default initializer? The array elements
> >> >selected by the strides have been undefined when calling init() as of
> >> >F2008 5.3.10 Â3 (first sentence) hence calling the finalizer. But from
> >> >that same sentence I would expect the default-initializer to be set for
> >> >the values instead.
> >>
> >> Because the default inizializer is called when you invoke ALLOCATE,
> >> whereas the finalizer is invoked at the time you enter the INIT
> >> routine since it has an INTENT(OUT) dummy argument.
> >> Since within INIT you do not touch the X argument anymore, the output
> >> is consistent with the rules.
> >>
> >> Saying it again, the default initializer is only invoked when you
> >> create a new variable instance by an ALLOCATION, or (as in the
> >> attached example) by using an automatic array of the correct type
> >> module type_mod
> >> type t1
> >> integer :: i = 42
> >> contains
> >> final :: fin
> >> end type t1
> >> contains
> >> elemental subroutine fin(x)
> >> type(t1), intent(inout) :: x
> >> x%i = -13 * x%i
> >> end subroutine fin
> >> end module type_mod
> >>
> >> module init_mod
> >> use type_mod
> >> contains
> >> subroutine init(x)
> >> type(t1), intent(out) :: x(:,:)
> >> type(t1) :: a(size(x,1),size(x,2))
> >> x = a
> >> end subroutine init
> >> end module init_mod
> >>
> >> program tryfin
> >> use init_mod
> >>
> >>
> >> type(t1), allocatable :: x(:,:)
> >> allocate(t1 :: x(5,5))
> >> x%i = 1
> >> call init(x(::2, ::3))
> >>
> >> write(*,*) x%i
> >> end program tryfin
> >>
> >>
> >> which produces
> >> [sfilippo@localhost PSBLAS_V3]$ ./tryfin
> >> 42 1 42 1 42
> >> 1 1 1 1 1 1
> >> 1 1 1 1 42 1
> >> 42 1 42 1 1 1
> >> 1 1
> >>
> >>
> >> because the initializer is called when you instantiate the local variable
> >> A.
> >>
> >> Salvatore
> >
> >
> > --
> > Andre Vehreschild * Email: vehre ad gmx dot de
--
Andre Vehreschild * Email: vehre ad gmx dot de
More information about the Fortran
mailing list