RE: [ROOT] Problem with template vector<>

From: Philippe Canal (pcanal@fnal.gov)
Date: Tue Mar 23 2004 - 16:53:18 MET


> 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.

A #include does not change the scope of the parsing.
So when you do
   #include <vector>
   void function() {....}
This properly declare vector in the global scope.
When you do
   void function() {
     #include <vector>
   }
This attemps to declare vector in the local scope
of the function.  This is of course wrong.  In
addition, <vector> might contain code that is
not proper for inside a function.  At any rate,
if it did succeed the result would not be what
you might have expected.

Cheers,
Philippe.



-----Original Message-----
From: Kay Ulbrich [mailto:ulbrich@iskp.uni-bonn.de]
Sent: Tuesday, March 23, 2004 7:12 AM
To: Philippe Canal
Cc: Kay Ulbrich; roottalk@pcroot.cern.ch
Subject: RE: [ROOT] Problem with template vector<>


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