Hi Pere, A variant of my first program answering your 2nd question. void pere2() { // 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"); Long_t l; 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); TLine *line = (TLine*)l; line.Draw(); } } Rene Brun Pere Mato wrote: > > 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