(j3.2006) Vipul Parekh's post in comp-fortran-90
Van Snyder
Van.Snyder
Wed May 31 16:40:04 EDT 2017
On Wed, 2017-05-31 at 19:19 +0000, Bill Long wrote:
> > On May 31, 2017, at 2:01 PM, Van Snyder <Van.Snyder at jpl.nasa.gov> wrote:
> >
> > Vipul Parekh posted a question in comp-fortran-90 that makes me believe
> > we need an interp concerning recursive relationships between types using
> > allocatable components. His example was
> >
> > type :: t
> > type(t), allocatable :: next
> > end type t
> > type(t) :: foo
> > foo = t(foo)
> > print *, 'Is foo%next allocated? ', allocated(foo%next)
> >
> > For this example, I'd say the print statement ought to print F
>
> Agreed.
>
> But I don?t understand why he didn?t try the obvious:
>
> allocate (foo%next)
>
> if the goal is to allocate foo%next.
>
> >
> > But in this example
> >
> > allocate ( foo )
>
> foo is not allocatable according to the declaration type(t) :: foo.
My mistake. Foo should have been allocatable to illustrate the problem.
I'll send the whole thing again with the allocatable attribute on foo.
>
> The ?recursion? here is on the name of the type - having an
> allocatable component of type(t) in the definition of type(t).
> Similar pointer components are also allowed.
>
> Cheers,
> Bill
>
>
> > foo = t(foo)
> >
> > it appears that there is a cyclic relationship between foo and itself
> > using its next component. It depends upon whether foo is deallocated
> > before t(foo) is evaluated. If it's not, there is a cyclic
> > relationship. I believe one of the goals of the initial design of the
> > ALLOCATABLE attribute was to prevent cyclic relationships.
> >
> > It might be necessary to add to the requirements for assignment to an
> > allocatable variable that it is deallocated if it has any allocatable
> > components. This might be too strong. For example, it would prevent
> > walking down a linked list using
> >
> > foo = t(foo%next)
> >
> > A possibility for this example is to interpret it as
> >
> > type(t) :: temp
> > allocate ( foo )
> > call move_allocate ( foo, temp )
> > foo = t(temp)
> >
> > But it's not obvious that scenarios using multiple recursively-connected
> > types don't still result in cyclic relationships.
> >
> > This will need some deep investigation.
> >
> > Althogh I'm the one who proposed to allow recursive relationships
> > between types using allocatable components, maybe we ought to remove it.
> >
> >
> >
> > _______________________________________________
> > J3 mailing list
> > J3 at mailman.j3-fortran.org
> > http://mailman.j3-fortran.org/mailman/listinfo/j3
>
> Bill Long longb at cray.com
> Principal Engineer, Fortran Technical Support & voice: 651-605-9024
> Bioinformatics Software Development fax: 651-605-9143
> Cray Inc./ 2131 Lindau Lane/ Suite 1000/ Bloomington, MN 55425
>
>
More information about the J3
mailing list