Re: [ROOT] Embedding root

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Jun 12 2003 - 21:56:28 MEST


Hi Rudiger,

When you call ProcessLine in this way, you must tell CINT the data type
of the arguments via a cast before the hexadecimal address.
You can see examples in $ROOTSYS/gpad/src/TPad.cxx, eg:

gROOT->ProcessLine(Form("((TPad *)0x%lx)->CreateNewText(%d,%d,%d,%d);",
gROOT->ProcessLine(Form("((TPad *)0x%lx)->CreateNewPave(%d,%d,%d,%d);",
gROOT->ProcessLine(Form("((TPadView3D 
*)0x%lx)->PaintBeginModel();",(Long_t)fPadView3D)
gROOT->ProcessLine(Form("((TPadView3D 
*)0x%lx)->PaintEnd();",(Long_t)fPadView3D));
gROOT->ProcessLine(Form("((TPadView3D 
*)0x%lx)->PaintScene();",(Long_t)fPadView3D));


On 
Thu, 12 Jun 2003, Rüdiger Berlich wrote:

> Hi there,
> 
> I'm trying to embed root into a C++ application in the following way:
> In the constructor of a class I call
> 
> myInterpreter = new TRint("ROOT population", NULL, NULL);
> 
> myInterpreter is defined as TRint * in the same class. A function of that
> class is then supposed to repeatedly execute root scripts like this :
> 
> gROOT->ProcessLine(Form(".x 
> %s(%p,%d,%p)",rootScript.c_str(),values,size_this,&result),&error);
> 
> "values" is a double array of size size_this, result is a double. I'm using
> the following example script, it is stored in a file parabola.cc (the same
> name is stored in the string "rootScript", see above).
> 
> void parabola(double *values, int nValues, double *result)
> {
>   int i;
> 
>   *result=0;
>   for(i=0; i<nValues; i++)
>     *result += values[i]*values[i];
> }
> 
> Executing my application results in the following error message :
> 
> [...]
> CINT/ROOT C/C++ Interpreter version 5.15.74, Feb 2 2003
> Type ? for help. Commands must be C++ statements.
> Enclose multiple statements between { }.
> Error: Function parabola(0xbfffd8d0,2,0xbfffda38) is not defined in current 
> scope  FILE: LINE:0
> Possible candidates are...
> filename       line:size busy function type and name
> parabola.cc       1:8    0 public: void parabola(double* values,int 
> nValues,double* result);
> [...]
> 
> If I do the same directly in root, namely :
> 
> root [0] double values[2]={2.,2.};
> root [1] double result;
> root [2] int size_this = 2;
> root [3] .x parabola.cc(values,size_this,&result);
> root [4] cout << result << endl;
> 8
> 
> I get back the correct result. 
> 
> Any help is appreciated !
> 
> Have a nice day,
> Ruediger Berlich
> 



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET