Karim Belabas on Sat, 16 Jun 2012 09:28:28 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: segfault on reading vector


* Charles Greathouse [2012-06-15 16:29]:
> I wrote a quick script to help someone with an "insert operators into
> 123456789 to make 100" problem.  In essence, it was 9 nested loops
> building a string with
> if(trap(,0,eval(s9)==100),
> 	listput(v,s9)
> )
> inside, where v is a List.  At the end it returns Vec(v). The program
> runs without problems, but when I try to access the return value I get
> *** type: bug in PARI/GP (Segmentation Fault), please report
> on both
>           GP/PARI CALCULATOR Version 2.6.0 (development git-d1d257d)
>            i686 running mingw (ix86/GMP-5.0.1 kernel) 32-bit version
>                 compiled: May  9 2012, gcc version 4.6.3 (GCC)
>                 (readline v6.2 enabled, extended help enabled)
> and even on the old
>          GP/PARI CALCULATOR Version 2.4.2 (development CHANGES-1.1971)
>            i686 running cygwin (ix86/GMP-4.2.1 kernel) 32-bit version
>  compiled: Dec 23 2007, gcc-3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
>                  (readline v5.2 enabled, extended help enabled)
> 
> I don't know why this is -- a general bug, a Windows-specific bug, or
> a problem with my code. I tried it with iferr as well (only on 2.6.0)
> with the same result.
> 
> If I change the program to print the results and return a tally, it
> works without difficulty.  The full code is
[...]

Can't reproduce this so far, and valgrind shows nothing suspicious :-(. 

Side notes :
1) Why do you need to trap exceptions ? Just removing op[n9] should do
the trick

2) A slightly more elegant ( and more than twice slower ) version

  test()={
    my(op = ["","+","-","*","/"], v = List());
    forvec(s = vector(9, i, [1,5]),
      my(t);
      t = Str(1, op[s[1]], 2, op[s[2]], 3, op[s[3]], 4, op[s[3]],
              5, op[s[5]], 6, op[s[6]], 7, op[s[7]], 8, op[s[8]], 9);
      if(eval(t) == 100, listput(v, t))
    );
    Vec(v)
  };


Cheers,

    K.B.

> test()={
> 	my(s1,s2,s3,s4,s5,s6,s7,s8,s9,op=["","+","-","*","/"],v=List());
> 	for(n1=1,5,
> 		s1=Str(1, op[n1]);
> 		for(n2=1,5,
> 			s2=Str(s1, 2, op[n2]);
> 			for(n3=1,5,
> 				s3=Str(s2, 3, op[n3]);
> 				for(n4=1,5,
> 					s4=Str(s3, 4, op[n4]);
> 					for(n5=1,5,
> 						s5=Str(s4, 5, op[n5]);
> 						for(n6=1,5,
> 							s6=Str(s5, 6, op[n6]);
> 							for(n7=1,5,
> 								s7=Str(s6, 7, op[n7]);
> 								for(n8=1,5,
> 									s8=Str(s7, 8, op[n8]);
> 									for(n9=1,5,
> 										s9=Str(s8, 9, op[n9]);
> 										if(trap(,0,eval(s9)==100),
> 											listput(v,s9)
> 										)
> 									)
> 								)
> 							)
> 						)
> 					)
> 				)
> 			)
> 		)
> 	);
> 	Vec(v)
> };
> 
> (inelegant, but runs fast enough)
-- 
Karim Belabas, IMB (UMR 5251)  Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1          Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation    http://www.math.u-bordeaux1.fr/~belabas/
F-33405 Talence (France)       http://pari.math.u-bordeaux1.fr/  [PARI/GP]
`