Hello Xiaorong, I am happy to answer your question. This is a Cint limitation. You have STL container classes vector<Dimuon> and vector<Particle> interpreted. they work to some extent, but not perfect. You'll find this kind of problem as you go on. Solution is to precompile vector<Dimuon> and vector<Particle> in libDimuon.so using #pragma link statement. #include <vector> class Particle { .... }; class Dimuon { .... }; #ifdef __MAKECINT__ #pragma link C++ class vector<Dimuon>; #pragma link C++ class vector<Particle>; #endif Then, things will be fine. Thank you Masa Goto ----- Original Message ----- From: "Philippe Canal" <pcanal@fnal.gov> To: "Cint" <cint@pcroot.cern.ch> Sent: Thursday, April 17, 2003 12:06 AM Subject: [CINT] FW: [ROOT] CINT and STL vector of private class > > > -----Original Message----- > From: owner-roottalk@pcroot.cern.ch > [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Xiaorong Wang > Sent: Tuesday, April 15, 2003 11:21 PM > To: 'Rene Brun' > Cc: 'Root Mailinglist' > Subject: [ROOT] CINT and STL vector of private class > > > Dear Root expert, > > I need your help on this issue. I am using ROOT 3.01/05, linux 7.3. > Thanks for your time. > > I created two private class Paricle and Dimuon(two particles build one > Dimuon), and use > > rootcint -f $*Dict.C -c $(CINTFLAGS) $(DEFS) $(INCLUDES) $*.hh > > to generate the root dictionary and library file libDimuon.so. > > I load this library and use STL vector in root macro file > > ********************* > #include <iostream> > #include <fstream> > #include <stdio.h> > #include <vector> > > class Dimuon; > class Particle; > > void main() > { > gSystem->Load("install/lib/libDimuon.so"); > vector<Dimuon> DimuVec; > vector<Particle> ParVec; > > int q1 = -1; > int q2 = 1; > float E1=3.0; > float Px1=1.0; > float Py1=1.0; > float Pz1=1.0; > float E2= 5.0; > float Px2=1.4; > float Py2=1.2; > float Pz2=1.0; > > Particle *muon1 = new Particle(q1, E1,Px1,Py1,Pz1); > Particle *muon2 = new Particle(q2, E2,Px2,Py2,Pz2); > > ParVec.push_back(*muon1); > ParVec.push_back(*muon2); > > Dimuon *jpsi = new Dimuon(muon1, muon2); > DimuVec.push_back(*jpsi); > > delete muon1; > delete muon2; > delete jpsi; > > vector<Particle>::iterator mu1; > for (mu1 = ParVec.begin(); mu1 < ParVec.end(); ++mu1){ > cout << "I am here particle iterator loop " << endl; > } > > vector<Dimuon>::iterator dimu; > for (dimu = DimuVec.begin(); dimu < DimuVec.end(); ++dimu){ > cout << "I am here Dimuon iterator loop " << endl; > } > cout << "DimuVec size= " << DimuVec.size() << endl; > cout << "ParVec size= " << ParVec.size() << endl; > > } > > ******************************************** > > when I run this marco, I got correct output, at the end of the root run, > it crash by segmentation violation. > > *************** > root [0] .L try.C > root [1] main() > I am here particle iterator loop > I am here particle iterator loop > I am here Dimuon iterator loop > DimuVec size= 1 > ParVec size= 2 > > *** Break *** segmentation violation > Root > Function main() busy flag cleared > **************** > > when I trace this root file: I got > > ************* > void destroy(Dimuon* first, Dimuon* last) { > while (first != last) destroy(first++); > } > !!! Reading template destroy > # 120 "algobase.h" > 120 > 121 void destroy(Dimuon* first, Dimuon* last) { > 122 while (first != last) destroy(first++); > 123 } > !!!Complete instantiating template destroy > > *** Break *** segmentation violation > Root > !!!Destroy static member object 0x883f838 > vector<Particle>::~TRint() !!!Destroy static member object 0x8822e58 > vector<Dimuon>::~TRint() Function main() busy flag cleared > ************** > > PS: I can do this correctly using standard C++ without CINT, is this > CINT problem or I did something wrong. > > Thanks, > Xiaorong > > >
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:11 MET