Hi Rene,
Thanks very much. I think this answers my questions 1 and 3, but still I
do not see how to return a value that is not a int, float or char*. The
TMethodCall::Exec() only offers these posibilities. For example how I get
the TCanvas::GetFrame() executed that is supossed to return a TFrame*.
Should I get the int and cast it to TFrame*? Do you never return a complex
object by value in ROOT?
Pere
> -----Original Message-----
> From: Rene.Brun@cern.ch [mailto:Rene.Brun@cern.ch]
> Sent: 18 January 2002 09:51
> To: Pere Mato
> Cc: Roottalk
> Subject: Re: [ROOT] Questions on using the Meta Classes
>
>
> Hi Pere,
>
> The answer to your 3 questions is to use TMethodCall. A small example:
> void pere() {
> // example illustrating the use of TMethodCall
>
> void pere() {
> // example illustrating the use of TMethodCall
>
> //create a TMethodCall for the TLine constructor
> TMethodCall mc,mcdraw;
>
> mc.InitWithPrototype(TLine::Class(),"TLine","double,double,double,
> double");
> mcdraw.InitWithPrototype(TLine::Class(),"Draw","const char*");
> Long_t l,ldraw;
> TRandom r;
> char params[100];
> //draw 100 lines
> for (int i=0;i<100;i++) {
> sprintf(params,"%f,%f,%f,%f",r.Rndm(),r.Rndm(),r.Rndm(),r.Rndm());
> mc.Execute(0,params,l);
> mcdraw.Execute((TLine*)l," ",ldraw);
> }
> }
>
> In the InitWithPrototype call, you can specify any complex type:
> - basic type,
> - class
> - pointer, etc
>
> to pass a pointer, simply encode the value of the pointer, eg for a TLine*
> sprintf(params,"(TLine*)0x%x",line); //where line is a TLine*
>
> Rene Brun
>
> Pere Mato wrote:
> >
> > Hi All,
> >
> > I am trying to make an exercise of interfacing ROOT with
> Python using the
> > API provided by the ROOT Meta classes (TClass, TMethod,
> TDataMember, etc.)
> > and I have several questions:
> >
> > - How to call a constructor with arguments. The method
> TClass::New() calls
> > only the default constructor. I naively tried to call the class
> constructor
> > method as a normal method using TObject::Execute(...)
> immediately after the
> > object has been created with TClass::New() but it does not seem to work.
> >
> > - How to get the return value of a function/method call. The method
> > TObject::Execute(...) does not give you this possibility. Also
> the method
> > TMethodCall::Execute(...) allows only to return either a long,
> double or a
> > string but nothing else.
> >
> > - How I can pass a "complex" data type as an argument to a method. In
> > particular, how I can give a TObject* as argument. The way I
> understand the
> > method TObject::Execute() works is by constructing a string with comma
> > separated argument values. In the case of being within the CINT
> interpreter
> > it seems that you can pass the name of a CINT variable pointing to your
> > complex data type. But if you are not in CINT, which is exactly
> my case I do
> > not see how I can do it.
> >
> > Thanks in advance for any hint or suggestion,
> >
> > ------------------------------------------------------------
> > Pere Mato CERN, EP Division, CH 1211 Geneva 23, Switzerland
> > e-mail: Pere.Mato@cern.ch tel: +41 22 76 78696
> > fax: +41 22 76 79425 gsm: +41 79 20 10855
>
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:38 MET