Re: [ROOT] array of pointers

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Aug 22 2002 - 19:48:50 MEST


Hi Tommaso,

A quick and brief answer to your mail
 for your point about TGraph input, I suggest you use the
TGraph function able to read automatically two columns from a file:
TGraph(const char *filename, const char *format="%lg %lg", Option_t
*option="");
       
for your second point, I recommend the use of a hihger level object such
as TMatrixD instead of using bare C++ pointers.

Rene Brun

On Thu, 22 Aug 2002, Tommaso Chiarusi wrote:

> Dear rooters,
> I have found this strange behaviour (naturally from my point of view) 
> concerning the way cint treats the trasmission of an array of pointers 
> with respect to what the g++ compiler does.
> 
> I have written the simple function "ReadFile" that reads one text 
> datafile (with data organized in columns, each of the same lengths!) 
> without caring about its actual length,
> retrieving its columns in as many as double arrays, ready to be used for 
> example with a TGraph.
> 
> As input I need to give only the input filename "fin", the number of 
> columns "ncolumns", an array of pointers  "var" dimensioned by the same 
> number of the columns, and in the end a initially empty variable for the 
> lenght of each column "nrows".
> 
>     as an example:
> 
>     ifstream fin("file_1.dat");
>     int ncolumns = 5;       
>     double **var = new double*[ncolumns];
>     int nrows=0;
>      
> 
> At this point I need to call my function, which is
> 
>     MyClass::ReadFile(ncolumns,fin,*var,nrows);
>                                                            ^^^^
> in case of implementation of the function as a method of a class (in my 
> case is a class obtained with MakeClass upon a file.root);
> 
> while is
> 
>    ReadFile(ncolumns,fin,var,nrows);
>                                          ^^^   
> if I use a non root C++ program, compiled with g++ v. 2.96, where the 
> function is set before the main().
> 
> The ^^^^ should point to the difference.
> 
> 
> the definition of the function is as  the same as in both the cases, i.e.
> 
> 
> void ReadFile( int& ncolumns, ifstream&  file, double** &var, int& nrows)
> { 
>   double x = 0;
>   vector<double> *v = new vector<double>[ncolumns];
>  
>   while(!file.eof())
>     {
>       for(int i=0; i<ncolumns;i++)
>     {
>       file>>x;
>         v[i].push_back(x);
>     }
>     }   
> 
>   nrows = v[0].size()-1;
>  
>   double *ar;
>  
>   for(int j=0;j<ncolumns;j++)
>     {
>       ar = new double[nrows];
>       for(int k=0;k<nrows;k++)
>     {
>       ar[k]=v[j][k];
>     }
> 
>       var[j]=ar;
>     }
>  
>  
> }
> 
>     If I take care to use such different notation "*var" or "var" 
> according to  cint or g++ I get no problem, and everyone is happy.
> But if I use with cint the notation valid for g++ I get an error.
> 
> So , what do I ignore about C++?
> Is this normal?
> 
> 
> Cheers, Tommaso  
> 
> Further, in the cint case, if I give the same call as in the program I get
> 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:05 MET