Ruben, My recommendation was to create the TIter outside the loop. The TIter is automatically destroyed when it goes out of scope. Rene Brun On Mon, 22 Apr 2002, Ruben Shahoian wrote: > Thank you, Rene, > I did: > TList* lst=0; > TIter next(lst); > for(int nev = firstEv; nev < lastEv; nev++){ > TList *lst = new TList(); > if (nev>=threshold ) { > next.Reset(); > ... > } > delete lst; > } > > It worked fine. But the problem is that in real program depending on the > conditions we have to loop over different lists. I noticed that TIter is > not destroyed at the exit from the loop where it was created. Is there any > way to delete it? > > Regards, > Ruben > > On Mon, 22 Apr 2002, Rene Brun wrote: > > > Hi Ruben, > > > > Create your TList and TIter outside the main loop. > > Inside the loop , call > > next.Reset(); //this is required in the loop > > > > Rene Brun > > > > On Mon, 22 Apr 2002, Ruben Shahoian wrote: > > > > > Hello, > > > we are getting segmentation violation in the following situation: > > > we loop over the event object, containing the list, and if certain > > > conditions satisfied, we loop over the TList in the event using TIter. > > > If TIter happens to work just at the first cycle of the loop, it runs > > > without problems. Otherwise using next() ( TIter next(lst) ) causes > > > seg.vol. The simple macros below demonstrates this behaviour. > > > > > > Are there any suggestions? > > > > > > Best regards, > > > Ruben > > > > > > void testnext(Int_t firstEv=2,Int_t threshold=2) > > > { > > > int lastEv = 5; > > > char strg[10]; > > > for(int nev = firstEv; nev < lastEv; nev++){ > > > printf("event %d\n",nev); > > > TList *lst = new TList(); > > > sprintf(strg,"Ev#%d",nev); > > > lst->Add(new TNamed(strg,strg)); > > > if (nev>=threshold ) { > > > printf("TList::Print produces: "); > > > lst->Print(); > > > TIter next(lst); > > > TNamed* dig; > > > printf("Using TIter() produces: "); > > > while( (dig=(TNamed*)next()) ) { > > > dig->Print(); > > > } > > > } > > > delete lst; > > > } > > > } > > > > > > ******************************************* > > > * * > > > * W E L C O M E to R O O T * > > > * * > > > * Version 3.02/07 14 February 2002 * > > > * * > > > * You are welcome to visit our Web site * > > > * http://root.cern.ch * > > > * * > > > ******************************************* > > > > > > Compiled for linux with thread support. > > > > > > CINT/ROOT C/C++ Interpreter version 5.15.25, Jan 6 2002 > > > Type ? for help. Commands must be C++ statements. > > > Enclose multiple statements between { }. > > > root [0] .x testnext.C(2,2) > > > event 2 > > > TList::Print produces: OBJ: TNamed Ev#2 Ev#2 > > > Using TIter() produces: OBJ: TNamed Ev#2 Ev#2 > > > event 3 > > > TList::Print produces: OBJ: TNamed Ev#3 Ev#3 > > > Using TIter() produces: OBJ: TNamed Ev#3 Ev#3 > > > event 4 > > > TList::Print produces: OBJ: TNamed Ev#4 Ev#4 > > > Using TIter() produces: OBJ: TNamed Ev#4 Ev#4 > > > > > > root [1] .x testnext.C(1,2) > > > event 1 > > > event 2 > > > TList::Print produces: OBJ: TNamed Ev#2 Ev#2 > > > Using TIter() produces: > > > *** Break *** segmentation violation > > > Root > Function testnext() busy flag cleared > > > > > > > > > > >
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:51 MET