Hello.
I have a script which works under cint.
I need to convert it into a compiled executable.
I become aware that cint automatically cures all the C++ venial sins in
the code...
Unfortunately, my g++ compilator feels such sins become as unforgiven.
I try to cure my mistakens, so I managed to compile,
But I get Segmentation fault.
I am quite sure that my problem IS NOT on some include files or
libraries which may lack.
It is a problem of segmentation, so it should concern the usage of
pointers.
The problem is when I try to fill and then read an
"array of TClonesArray"
Conceptual sketch:
Imagine a detector subdivided into several zones.
The number of interesting zone is variable, say "ntotal_zone"
For each zone I have several tracks.
So I need to make "ntotal_zone" collection of tracks.
I decided to collect the tracks of each zone by means of a TClonesArray.
So, I find myself with an array of TClonesArray.
In the cint-script I use the following (!uncorrect! but working syntax)
TClonesArray *vUp = new TClonesArray[ntotal_zone];
TClonesArray *vDown = new TClonesArray[ntotal_zone];
int *contau = new int[ntotal_zone];// vectors which counts the
number of tracks for each zone
int *contad = new int[ntotal_zone];
TMatrix *notru = new TMatrix(ntotal_zone,neventUp);
TMatrix *notrd = new TMatrix(ntotal_zone,neventDown);
for(int in =0;in<ntotal_zone;in++) // initialization of all the
TClonesArrays
{
vUp[in]= new TClonesArray("Track",neventUp);
vDown[in]= new TClonesArray("Track",neventDown);
contau[in]=0;
contad[in]=0;
}
Then when I fill I use the following (whithin a loop on the total
number of the zones -
nozone is the number of the currently analysed zone, let's call this
procedure as (p.1) ):
new(vUp[nozone][contau[nozone]])
Track(trUp->x(),trUp->y(),trUp->a(),trUp->b(),trUp->pol());
Note the array-form of the TClonesArray:
vUp[nozone] ....... should give the pointer to a TClonesArray
vUp[nozone][contau[nozone]] ....... should give the component of such
pointer
When trying to convert everithing into a g++ stand-alone executables, I
noticed that I was using a unforgiven syntax and I changed it by
using the following:
TClonesArray* *vUp = new TClonesArray*[ntotal_zone];
TClonesArray* *vDown = new TClonesArray*[ntotal_zone];
... i.e. as a list of pointers to TClonesArray, which are initialized as
the same as in the cint-script.
The filling procedure should remain the same as (p.1). If I do this the
compiler prompt out the following errors
Analisi_match3.C:321: no matching function for call to `Track::operator
new (unsigned int, TClonesArray &)'
/home/applicazioni/root/include/TObject.h:153: candidates are: static
void *TObject::operator new
(unsigned int)
/home/applicazioni/root/include/TObject.h:154: static
void *TObject::operator new
(unsigned int, void *)
Instead, if I write (note the "&" in the argument of "new()" )
new(&vUp[nozone][contau[nozone]])
Track(trUp->x(),trUp->y(),trUp->a(),trUp->b(),trUp->pol());
I get the program to compile, but when I start to iterate through the
TClonesArray, the program crashes dumping a sementation fault.
What's wrong?
My system is
Toshiba Satellite 1800 LapTop,
Linux Mandrake 8.1
Root Version 3.03/09 18 September 2002
gcc version 2.96 20000731 (Mandrake Linux 8.1 2.96-0.62mdk)
Thank you very much
Tommaso
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:11 MET