Hi Andreas, I am not sure to follow all your explanations. It looks like m_delta is a pointer to an array allocated somewhere else. In this case you should not do I/I twice. Did you try the following declaration? Float_t *m_delta; //! make member non persistent If this declaration does not fix the problem, I will need a real piece of code and a test as short as possible. Rene Brun Andreas WILDAUER wrote: > > Hi Rene, > > thanks for your quick answer. > Nevertheless it's not solved yet: > > I have a return function which returns a pointer to an array of 4 floats > > in my CONFIG class the original 2-d array is: > Float_t m_delta[4][4]; > > and the pointer returned by the member function is: m_delta[0] (for example) > > so, in my CALCULATE class I need a pointer like this (I thought): > > Float_t * m_delta; > which then is "assigned" to point to the array of 4 floats > m_delta = (member function of config class which returns delta[0]); > and in this case: m_delta[2] in CALCULATE has the value of m_delta[0][2] of > CONFIG > > ok, if this doesn't work because of the reasons you mentioned, I tried > Float_t m_delta[4]; > > so it is for sure that ROOT knows m_delta is a pointer to an array containing > 4 floats. > But now: > > m_delta = (member function, ... see above); > gives me the following error message: > > Error: Incorrect assignment to m_delta_eta_Si, wrong type 'Float_t*' > FILE:Level2IDandIDCalo.C LINE:138 > (I changed var names in my example so it is shorter) > That was the way I first tried, and I still don't understand the error since > the member funciton returns a pointer and m_delta is a pointer. > > Since I only need "one 4 array" in my CALCULATE class out of the 4by4 array > defined in CONFIG theres no use to define: > > Float_t m_delta[4][4]; > > in my calculate class. (Out of "desperation" I tried this as well and get even > more errors.) > > I hope it's not me beeing stupid ... > Thanks in advance again for an additional hint ... > > Andi W > > ( > Add. info (not so important): it always works if the starting point is a 1-d > array: > > CONFIG: > Float_t m_delta[4]; > > Float_t * returndelta() {return m_delta;} > > CALCULATE: > Float_t * m_delta; > m_delta = returndelta(); > cout << m_delta[2] << endl; > > here it also doesnt know how "long" the array is *m_delta points to. > ) > > On Thursday 17 July 2003 14:15, Rene Brun wrote: > > 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