Re: TArray::Set and changing sizes of arrays

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Dec 22 1999 - 10:10:50 MET


Hi Georges,
I agree with your comments and will implement
your proposed changes in the TArray classes.

Rene Brun



On Tue, 21 Dec 1999, George Heintzelman wrote:

> 
> It seems that using TArray*::Set(Int_t n), while being able to grow or 
> shrink the array, also wipes out any data in the previous array (but 
> only if n is >= 0 and not equal to the previous value). This seems 
> crazy; if I wanted a new, blank array, I would just create it myself. 
> Keeping the old data allows one to easily use TArray's which can grow 
> at need.
> 
> Currently the code is:
> 
>  void TArrayF::Set(Int_t n)
> {
>    // Set array size of TArrayF object to n floats.
>    // If n<0 leave array unchanged.
> 
>    if (n < 0) return;
>    if (fArray && fN != n) {
>       delete [] fArray;
>       fArray = 0;
>    }
>    fN = n;
>    if (fN == 0) return;
>    if (!fArray) fArray = new Float_t[fN];
>    for (Int_t i = 0; i < fN; i++)
>       fArray[i] = 0;
> }
> 
> I propose instead that this code should be:
> 
> void TArrayF::Set(Int_t n)
> {
>    // Set array size of TArrayF object to n floats.
>    // If n<0 leave array unchanged.
> 
>    if (n < 0) return;
>    if (n != fN) {
>       Float_t *temp = fArray;
>       if (n != 0) {
>          fArray = new Float_t[n];
>          memcpy(fArray,temp,min(n,fN)*sizeof(Float_t));
>       } else {
> 	fArray = 0;
>       }
>       fN = n;
>       delete [] temp;
>    }
> }
> 
> George Heintzelman
> gah@bnl.gov
> 
> 
> 
> 
> 



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:44 MET