Re: [ROOT] array of pointers ...

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Jul 17 2003 - 14:15:19 MEST


Hi Andreas,

A declaration like
  Float_t * m_delta;

in a class is assumed to be a variable length array of floats by default.
To do I/O with this class, Root needs to know the effective length
of the array. A declaration like
  Float_t * m_delta;  //[m_len]
is required, where m_len is a data member of the class with the effective
length of then array.
When reading your class "Calculate", Root will automatically delete
th array m_delta and recreate a new array with the length m_len.

If your array is a fix length array (1-d, 2-d or more) you should use
  Float_t   m_delta[4][4];
instead of the pointer.

Rene Brun


Andreas WILDAUER wrote:
> 
> Hi everybody,
> 
> I have quite a strange problem:
> 
> in class CONFIG I have:
> 
> config.h: ***************
> private:
> Float_t m_delta[4][4];
> 
> public:
> Float_t * delta(int dset);
> 
> config.C: ****************
> 
> m_delta[0][0] = 0.07;
> m_delta[0][1] = 0.06;
> m_delta[0][2] = 0.05;
> m_delta[0][3] = 0.05;
> a.s.o.
> 
> Float_t * config::delta(Int_t dset) { return m_delta[dset];}
> 
> where m_delta[0] for example is a pointer on the four Float_t's
> m_delta[0][0-3]
> *******************************************************
> in the CALCULATE class I have:
> 
> calculate.h: *******************
> Float_t * m_delta;
> 
> and in calculate.C: *************
> config configobj;
> m_delta = configobj.delta(0);
> 
> So far m_delta should be a pointer on 4 Float_t's, namely: m_delta[0][0-3]
> which were defined in conifg.C.
> ********************************************************
> now I also have a printvalues member function in class CALCULATE.
> the code in MAIN program main.C is the following:
> 
> calculateobj.printvalues();
> cout << "GetEntries" << endl;
> fChain->GetEntry(jentry);
> calculateobj.printvalues();
> 
> where fChain is a private data member of the MAIN class (which also has all
> the ntuple variables as usual (from setMakeClass)).
> if i load main.C (not compiling) the output is:
> 
> m_delta[0] = 0.07
> m_delta[1] = 0.06
> m_delta[2] = 0.05
> m_delta[3] = 0.05    // CORRECT
> GetEntries
> m_delta[0] = 9.3887e-44
> m_delta[1] = 2.71071e-33
> m_delta[2] = nan
> m_delta[3] = 2.7111e-33  // ?????????????????????????
> 
> ????????????????????????
> how  can fChain->GetEntry(jentry); change the memory where the pointers
> m_delta[0-3] point to (which are private data members of another class,
> namely CALCULATE)
> 
> or is it wrong to assume that array[0] is a pointer when the array is defined
> as array[4][4] (like array1 is a pointer on array1[27], what I also use and
> it works ...)
> 
> Please help
> Thanks in advance
> Andi Wildauer



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:13 MET