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