(Class-) array finalization and initialization question
Salvatore Filippone
filippone.salvatore@gmail.com
Wed Feb 18 16:07:00 GMT 2015
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
More information about the Fortran
mailing list