From: Alexander S. <aso...@ho...> - 2013-07-15 03:42:50
|
Greetings! I am trying to understand this mapping : %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); As far I read from documentation this merely copies typemap for <STRING, LENGTH> into <indata, inlen>. But I could not find any typemaps for <STRING, LENGTH>. Is it something internal? Also I would like to know your advice about mapping 'int *data, size_t len'. My solution is to reuse (char *STRING, int LENGTH) typemap putting additional constraint on 'len'. Something like 'if (len % sizeof(int)) SWIG_exception(SWIG_ValueError, ...)'. Thank you in advance! -- Sincerely, Alexander |
From: Thomas M. <to...@al...> - 2013-07-15 23:12:13
|
Hi All, I am trying to derive off a C++ class in python (using directors) and want to turn around and pass this python object back to C++ to a different function that accepts the base class pointer. Is that possible? Let me show a short example of what I’m doing as that may make more sense.. Interface File: --------------- %module (directors="1") myModule %feature ("director"); // CPP Code (Here for consolidation reasons) %{ #include <iostream> using namespace std; class Base { public: virtual void Invoke() { cout << "Base::Invoke\n"; } virtual ~Base() {} }; class Tester { public: Base *_base; Tester (Base *base) : _base(base) { } void Run () { _base->Invoke(); } }; %} // Interface file class Base { public: virtual void Invoke(); }; class Tester { public: Tester (Base *base); void Run (); }; ----------------------END-------------------- Test.py: -------- import myModule class Derived (myModule.Base): def __init__ (self): pass def Invoke (self): print "Derived Invoked" myModule.Base(self) print "\nTest 1" b = myModule.Base() tester = myModule.Tester(b) tester.Run() print "\nTest 2" d = Derived () tester = myModule.Tester(d) tester.Run() ----------------------END-------------------- Running the above code shows test 1 working correctly. However, test2 fails. In test2, Derived is derived off Base and I would expect to be able to pass that to myModule.Tester (which does accept C++ Base *s). But, it python/swig errors out on that. Is this something now doable in swig, or am I overlooking something? Here is the full output from python: Test 1 Base::Invoke Test 2 Traceback (most recent call last): File "test.py", line 18, in <module> tester = myModule.Tester(d) File "D:\swigtest\myModule.py", line 108, in __init__ this = _myModule.new_Tester(*args) TypeError: in method 'new_Tester', argument 1 of type 'Base *' Any ideas why I can’t pass in Derived, which is derived off Base? Thanks! Tom |
From: Patrick A. <pa...@gm...> - 2013-07-16 00:05:17
|
I can't test this right now so there might be other issues, but right there I can see a problem with your Derived Class. It needs to look like this: Class Derived (myModule.Base): def __init__ (self): myModule.Base.__init__(self) def Invoke (self): print "Derived Invoked" example.Base(self) Hope this helps. On Jul 15, 2013, at 6:38 PM, Thomas Maslach <to...@al...> wrote: > > Hi All, > > I am trying to derive off a C++ class in python (using directors) and want to turn around and pass this python object back to C++ to a different function that accepts the base class pointer. Is that possible? Let me show a short example of what I’m doing as that may make more sense.. > > Interface File: > --------------- > %module (directors="1") myModule > %feature ("director"); > > // CPP Code (Here for consolidation reasons) > %{ > #include <iostream> > using namespace std; > class Base > { > public: > virtual void Invoke() { cout << "Base::Invoke\n"; } > virtual ~Base() {} > }; > > class Tester > { > public: > Base *_base; > Tester (Base *base) : _base(base) { } > void Run () { _base->Invoke(); } > }; > %} > > // Interface file > class Base > { > public: > virtual void Invoke(); > }; > > class Tester > { > public: > Tester (Base *base); > void Run (); > }; > ----------------------END-------------------- > > > Test.py: > -------- > import myModule > > class Derived (myModule.Base): > def __init__ (self): > pass > > def Invoke (self): > print "Derived Invoked" > myModule.Base(self) > > print "\nTest 1" > b = myModule.Base() > tester = myModule.Tester(b) > tester.Run() > > print "\nTest 2" > d = Derived () > tester = myModule.Tester(d) > tester.Run() > ----------------------END-------------------- > > Running the above code shows test 1 working correctly. However, test2 fails. In test2, Derived is derived off Base and I would expect to be able to pass that to myModule.Tester (which does accept C++ Base *s). But, it python/swig errors out on that. > > Is this something now doable in swig, or am I overlooking something? Here is the full output from python: > > Test 1 > Base::Invoke > Test 2 > Traceback (most recent call last): > File "test.py", line 18, in <module> > tester = myModule.Tester(d) > File "D:\swigtest\myModule.py", line 108, in __init__ > this = _myModule.new_Tester(*args) > TypeError: in method 'new_Tester', argument 1 of type 'Base *' > > Any ideas why I can’t pass in Derived, which is derived off Base? > > Thanks! > > Tom > > ------------------------------------------------------------------------------ > See everything from the browser to the database with AppDynamics > Get end-to-end visibility with application monitoring from AppDynamics > Isolate bottlenecks and diagnose root cause in seconds. > Start your free trial of AppDynamics Pro today! > http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user |
From: Thomas M. <to...@al...> - 2013-07-16 02:43:09
|
Thank-you for catching that error.. The method in invoke was meant to be removed, but you are right, I need to invoke the Base class constructor, otherwise I will have problems.. Thanks! -----Original Message----- From: Patrick Abeya [mailto:pa...@gm...] Sent: Monday, July 15, 2013 8:05 PM To: Thomas Maslach Cc: swi...@li... Subject: Re: [Swig-user] Passing Python Derived Object To C++ - Does it work? I can't test this right now so there might be other issues, but right there I can see a problem with your Derived Class. It needs to look like this: Class Derived (myModule.Base): def __init__ (self): myModule.Base.__init__(self) def Invoke (self): print "Derived Invoked" example.Base(self) Hope this helps. On Jul 15, 2013, at 6:38 PM, Thomas Maslach <to...@al...> wrote: > > Hi All, > > I am trying to derive off a C++ class in python (using directors) and want to turn around and pass this python object back to C++ to a different function that accepts the base class pointer. Is that possible? Let me show a short example of what I'm doing as that may make more sense.. > > Interface File: > --------------- > %module (directors="1") myModule > %feature ("director"); > > // CPP Code (Here for consolidation reasons) %{ #include <iostream> > using namespace std; class Base { > public: > virtual void Invoke() { cout << "Base::Invoke\n"; } > virtual ~Base() {} > }; > > class Tester > { > public: > Base *_base; > Tester (Base *base) : _base(base) { } > void Run () { _base->Invoke(); } > }; > %} > > // Interface file > class Base > { > public: > virtual void Invoke(); > }; > > class Tester > { > public: > Tester (Base *base); > void Run (); > }; > ----------------------END-------------------- > > > Test.py: > -------- > import myModule > > class Derived (myModule.Base): > def __init__ (self): > pass > > def Invoke (self): > print "Derived Invoked" > myModule.Base(self) > > print "\nTest 1" > b = myModule.Base() > tester = myModule.Tester(b) > tester.Run() > > print "\nTest 2" > d = Derived () > tester = myModule.Tester(d) > tester.Run() > ----------------------END-------------------- > > Running the above code shows test 1 working correctly. However, test2 fails. In test2, Derived is derived off Base and I would expect to be able to pass that to myModule.Tester (which does accept C++ Base *s). But, it python/swig errors out on that. > > Is this something now doable in swig, or am I overlooking something? Here is the full output from python: > > Test 1 > Base::Invoke > Test 2 > Traceback (most recent call last): > File "test.py", line 18, in <module> > tester = myModule.Tester(d) > File "D:\swigtest\myModule.py", line 108, in __init__ > this = _myModule.new_Tester(*args) > TypeError: in method 'new_Tester', argument 1 of type 'Base *' > > Any ideas why I can't pass in Derived, which is derived off Base? > > Thanks! > > Tom > > ---------------------------------------------------------------------- > -------- See everything from the browser to the database with > AppDynamics Get end-to-end visibility with application monitoring from > AppDynamics Isolate bottlenecks and diagnose root cause in seconds. > Start your free trial of AppDynamics Pro today! > http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.c > lktrk _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user |