RE: [ROOT] TClonesArray

From: tommaso chiarusi (Tommaso.Chiarusi@bo.infn.it)
Date: Wed Dec 22 2004 - 12:01:46 MET


Dear Philippe,

I managed to solve my problem in a very simple way:
I create a stand alone program, implementing the class which was using 
the TClonesArray in a compiled shared object.

I mean that, without changing a line, the same code does work if compiled 
and used out from the ROOT working frame (i.e. if not implemented in a 
macro and interpreted by CINT as with .x) .

I still not understand why... but many things happens as ROOT is 
executing. Maybe some crossover of memory which I could not manage.

btw, thanks a lot!
Tommaso




On Fri, 17 Dec 2004, Philippe Canal wrote:

> Hi Tommaso,
> 
> From your description it is not clear what is going wrong.
> The first thing you should try is to replace v->UncheckedAt by v->At to make
> sure you are really reading allocated memory.
> 
> Now there is no technical different between (strictly speaking):
> 	TClonesArray *v =  p.GettArray();
> And
> 	TClonesArray *v;
>         v =  p.GettArray();
> The difference I guess in that between the last 2 lines you have many other
> thing going-on that may or may not affect the result (like going
> out-of-scope, other unrelated memory over-write, etc.).
> 
> The simpliest is for you to send a very small, complete example that
> reproduces the problem.
> 
> Cheers,
> Philippe.
> 
> -----Original Message-----
> From: owner-roottalk@pcroot.cern.ch [mailto:owner-roottalk@pcroot.cern.ch]
> On Behalf Of tommaso chiarusi
> Sent: Friday, December 17, 2004 7:42 AM
> To: Root Newsgroup
> Subject: [ROOT] TClonesArray
> 
> Dear Rooters,
> Should it be stange the following?
> 
> You have a member function GetArray() which yields a pointer to
> TClonesArray.
> 
> so, in the scope of some methods:
> 
> 	TClonesArray *v =  p.GettArray();
> 	Evento &te = *((Evento*) v->UncheckedAt(cont));
> 
> 
> It's Ok and the Evento-memory segment does exist and it is filled with right
> things. While...
> 
> 	TClonesArray *v;
> 	v =  p.GettArray();
> 	Evento &te = *((Evento*) v->UncheckedAt(cont));
> 
> It ISN'T ok, and the Evento-memory segment is completely random.
> 
> 
> 
> What's happening?
> 
> I need to use the second case, since the TClonesArray pointer v should be a
> private data member of a class.
> In particular I should organize such stuff as the following:
> 
> 	TClonesArray *v;  -> IN THE PRIVATE DATA MEMBER DECLARATION SCOPE
> 
> 	v =  p.GettArray(); -> IN THE CLASS CONSTRUCTOR DEFINITION
> 
> 	Evento &te = *((Evento*) v->UncheckedAt(cont)); IN A MEMBER FUNCTION
>  
> 
> Maybe I'm forgetting some stupid rule.... 
> Thanks a lot,
> 
> Tommaso.
> 
> P.S.
> 
> System
> 
> ROOT:  Version   4.00/08       9 July 2004
> OS: Linux RH-9
> gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
> 
> 
> 
> --
> -----------------------
> 
> Dr. Tommaso Chiarusi 
> 
> Dipartimento di Fisica
> Universita' di Bologna
> INFN. Sez. Bologna
> 
> Tel +39.051.209.5234
> Fax +39.051.209.5269
> 
> -----------------------
> 
> 
> 

-- 
-----------------------

Dr. Tommaso Chiarusi 

Dipartimento di Fisica 
Universita' di Bologna
INFN. Sez. Bologna

Tel +39.051.209.5234 
Fax +39.051.209.5269

-----------------------



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:10 MET