Re: [ROOT] dinamic memory allocation within ROOT

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Nov 29 2002 - 18:54:43 MET


Hi Henrique,

At least one advantage of deriving from a common base class TObject.
You can do
  Histo_List[0])->Draw();

Rene Brun

On Fri, 29 Nov 2002, Henrique de M. J. Barbosa - mestrado wrote:

> 
> Pasha,
> 
> Thanks a lot for the advice, now it works. One more question: do you know 
> if it is possible to get the entries from a TObjArray with the proper 
> type? 
> 
> I mean, in my case they are all TH1D* histograms, but when I do:
> 
>   Histo_List[0]
> 
> I get a TObject* and not a TH1D*. Then, for instance, if I want to plot
> one of the histograms I have to use:
> 
>   ((TH1D*) Histo_List[0])->Draw()
> 
> to convert the "output" to the correct type and then draw it. It is
> possible to do it some other way?
> 
> Thanks a lot,
> 
> Henrique
> ****************************************
> State University at Campinas - BRASIL
> "Gleb Wathagin" Physics Institute
> Department of Cosmic Rays and Chronology
> 
> Henrique Barbosa      The Pierre Auger
> PhD Student             Observatory
> ****************************************
> 
> 
> > Hi Henrique, you can use TObjArray of histograms. -best, Pasha
> > 
> > "Henrique de M. J. Barbosa - mestrado" wrote:
> > > 
> > > Dear Root Masters,
> > > 
> > > I have the following problem: I want to build an array of histograms and
> > > use this array as a parameter of a function. Well, if I fix the size of
> > > the array before passing it to the function:
> > > 
> > >   void main(void) {
> > >     TH1F **histo;                        // I know this can be done
> > >     histo = malloc(sizeof(TH1F*)*Size);  //  just by TH1F *histo[Size]
> > > 
> > >     my_fill(histo);
> > >   }
> > > 
> > >   my_fill(TH1F** htemp) {
> > >     for (int i=0; i<Size; i++)
> > >        htemp = new TH1F();
> > >   }
> > > 
> > > Then it works perfectly. But my problem is that I want my subroutine to
> > > allocate the memory because only within the subroutine I will know what
> > > "Size" show be.
> > > 
> > > I tried to do the following:
> > > 
> > >   void main(void) {
> > >   TH1F **histo;
> > > 
> > >   my_fill(histo);
> > >   }
> > > 
> > >   my_fill(TH1F** htemp) {
> > >     htemp = malloc(sizeof(TH1F*)*Size);
> > >     for (int i=0; i<Size; i++)
> > >        htemp = new TH1F();
> > >   }
> > > 
> > > But it doesn't work. Any tips of how to do this? I have tried to do
> > > some simple tests and I found out that the root behaviour is diferent from
> > > the standard c++, maybe this is the problem, I don't know:
> > > 
> > >  root [0] double x = 3
> > >  root [1] &x
> > >  Error: reference type x with no initialization  FILE:/tmp/fileVv6eIH_cint LINE:1
> > >  Error: x already declared as different type FILE:/tmp/fileVv6eIH_cint LINE:1
> > >  *** Interpreter error recovered ***
> > >  root [2]
> > > 
> > > Shouldn't I've got the address of "x" in the code above?
> > > 
> > > []'s
> > > 
> > > Henrique
> > > ****************************************
> > > State University at Campinas - BRASIL
> > > "Gleb Wathagin" Physics Institute
> > > Department of Cosmic Rays and Chronology
> > > 
> > > Henrique Barbosa      The Pierre Auger
> > > PhD Student             Observatory
> > > ****************************************
> > 
> 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:21 MET