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