RE: [ROOT] Problem with template vector<>

From: Kay Ulbrich (ulbrich@iskp.uni-bonn.de)
Date: Tue Mar 23 2004 - 14:12:24 MET


On Monday, March 22, 2004, 15:36 -0600, Philippe Canal wrote:

> Hi,
> 
> Your initial problem is a deficiency in CINT's handling of local object.
> Masa is currently working to fix the problem.
> 
> In the meantime you have two work around.  One is to compile your code by
> just doing
> 	.L vector.C+
> (you will need to add a few more header file and change the name of
> the macro).
> Or you can allocate your object using new vector<TString>[27]
> 
> Cheers,
> Philippe.
> 
> -----Original Message-----
> From: owner-roottalk@pcroot.cern.ch
> [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Kay Ulbrich
> Sent: Monday, March 22, 2004 9:13 AM
> To: roottalk@pcroot.cern.ch
> Subject: [ROOT] Problem with template vector<>
> 
> 
> Hello,
> 
> I am using ROOT Version 3.10/01, output of uname -a:
> Linux HOST 2.4.10-4GB #1 Tue Sep 25 12:33:54 GMT 2001 i686 unknown
> 
> I have reproduced the problem I am encountering in a sample script.
> 
> //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> // Begin of source code
> 
> #include <vector>
> 
> void vector(void)
> {
>   vector<TString> odsetnames[9][3];
> 
> 
> odsetnames[2][0].push_back(TString("bell-anl_PLB94,310(80)_2250.5_tkin_1500.
> 0_plab_2250.5"));
> 
> odsetnames[2][0].push_back(TString("lehar-satu_NPB294,1013(87)_2354.2_tkin_1
> 596.0_plab_2354.2"));
> 
> odsetnames[2][0].push_back(TString("lehar-satu_NPB294,1013(87)_2354.2_tkin_1
> 596.0_plab_2354.2__2"));
> 
> odsetnames[2][0].push_back(TString("ball-satu_EPJA11,51(1999)_2353.1_tkin_15
> 95.0_plab_2353.1"));
> 
>   cout <<odsetnames[2][0].size()<<endl;
> }
> // End of source code
> // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
> 
> When calling "root vector.C", the output I get is (I have stripped the
> startup output):
> 
> -- begin of output --
> 
> root [0]
> Processing vector.C...
> 4
> 
>  *** Break *** segmentation violation
>  Generating stack trace...
> 
> -- end of output --
> 
> So obviously the vectors are initialised and
> vector<TString>::push_back() and vector<TString>::size() work, but
> nevertheless I get a segmentation fault. Is there something I should
> do in a different way?
> 
> By the way, if I change the script such, that the include statement is
> placed in the function block:
> 
> //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> // Begin of source code
> void vector(void)
> {
> 
> #include <vector>
> 
> [ ... ]
> 
> }
> // End of source code
> // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
> 
> I get the output:
> 
> -- begin of output --
> 
> root [0]
> Processing vector.C...
> Error: class,struct,union or type input_iterator_tag not defined
> FILE:/usr/local/cern/root/cint/stl/algobase.h LINE:63
> Internal error: global function template arg type
> FILE:/usr/local/cern/root/cint/stl/algobase.h LINE:63
> *** Interpreter error recovered ***
> 
> -- end of output --
> 
> Thank you for your suggestions,
> Kay
> 
> 

Hello Philippe,

thank you for your answer -- now it works.

Could you please explain to me, why the second problem occurs, I mean,
why it makes a difference, whether "#include <vector>" is outside the
macro (no error) or inside the macro (error)? I do not seem to
understand this.

Thank you,
Kay
-- 
======================================================================
Kay Ulbrich                                 
Helmholtz-Institut fuer 
Strahlen- und Kernphysik      
der Universitaet Bonn                            Tel.: +49-228-73 1768
Nussallee 14-16                        Institute FAX:  +49-228-73 2505
D-53115 Bonn, Germany                 E-mail: ulbrich@iskp.uni-bonn.de
======================================================================


  



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:06 MET