> < ^ From:

< ^ Subject:

Dear GAP-Forum,

Andreas Prinz wrote

I ran across a segmentation error with the following

computation:gap> el:=List([1..4],x->rec(num:=x));; gap> bl:=List([1..2],x->rec(num:=x,els:=Filtered(el,e->(e.num+x) mod 2=0)));; gap> for b in bl do for e in b.els do e.block:=b; od; od; gap> Set(bl); Segmentation fault (core dumped)I guess, it is due to the recursive nature of the structs, but

I need it to be such. Probably I can do with defining a "<"

relation for the records, but there seems to be a bug in gap

anyway.

Indeed the problem occurs because the objects contain themselves as

proper substructures.

Here is how 'bl[1]' looks like before the call of 'Set'.

gap> bl[1]; rec( num := 1, els := [ rec( num := 1, block := ~ ), rec( num := 3, block := ~ ) ] )

As the GAP manual says in the section "Comparison of Records",

the comparison of records is implemented by comparing the components.

This runs into an infinite recursion in this case.

So I would not regard the behaviour as a bug.

(A simpler example is the comparison of two lists that contain themselves.

gap> l:= [];; l[1]:= l;; l; [ ~ ] gap> l = Copy( l ); <segmentation fault>

This runs into an infinite recursion for the same reason.)

If one knows about the internal structure of objects as in the list 'bl',

implementing a special method for '<' that looks at the non-recursive

components first will solve the problem; the details are described in the

manual section cited above.

Kind regards

Thomas

> < [top]