From: Jacob F. <qu...@gm...> - 2011-02-23 11:31:03
|
Hi, I'm getting somewhat odd behavior when wrapping C++ functions that have all arguments optional. C++ header definition for the function talked about below: struct display { ... void draw(float = 0, float = 0, float = 1, float = NULL, float = NULL, float = 0, float = NULL); ... } A normal class::function looks like this in the outputted module .py file: def draw(self, *args) -> "void" : return _scge.display_draw(self, *args) But when all arguments are optional it looks like this... def draw(self, arg0 : 'float' = 0, arg1 : 'float' = 0, arg2 : 'float' = 1, arg3 : 'float' = None, arg4 : 'float' = None, arg5 : 'float' = 0, arg6 : 'float' = None) -> "void" : return _scge.display_draw(self, arg0, arg1, arg2, arg3, arg4, arg5, arg6) Now if I call display.draw() or with any arguments it gives an error: File "/media/Field/lb/pybin/scge.py", line 285, in draw arg5 : 'float' = 0, arg6 : 'float' = None) -> "void" : return _scge.display_draw(self, arg0, arg1, arg2, arg3, arg4, arg5, arg6) NotImplementedError: Wrong number of arguments for overloaded function 'display_draw'. Possible C/C++ prototypes are: draw(display *,float,float,float,float,float,float,float) draw(display *,float,float,float,float,float,float) draw(display *,float,float,float,float,float) draw(display *,float,float,float,float) draw(display *,float,float,float) draw(display *,float,float) draw(display *,float) draw(display *) If I change that line in the outputted module .py file to read: def draw(self, *args) -> "void" : return _scge.display_draw(self, *args) ...then I can call display.draw() fine. Is this a bug? Or something I'm doing wrong? That could be the case as I've only just started using SWIG 2 days ago, loving it too btw. |
From: William S F. <ws...@fu...> - 2011-02-27 16:41:57
|
On 23/02/11 11:30, Jacob F. wrote: > Hi, > > I'm getting somewhat odd behavior when wrapping C++ functions that have > all arguments optional. > > C++ header definition for the function talked about below: > struct display { > ... > void draw(float = 0, float = 0, float = 1, float = NULL, float = NULL, > float = 0, float = NULL); > ... > } > > A normal class::function looks like this in the outputted module .py file: > def draw(self, *args) -> "void" : return _scge.display_draw(self, *args) > > But when all arguments are optional it looks like this... > def draw(self, arg0 : 'float' = 0, arg1 : 'float' = 0, arg2 : 'float' = 1, > arg3 : 'float' = None, arg4 : 'float' = None, > arg5 : 'float' = 0, arg6 : 'float' = None) -> "void" : return > _scge.display_draw(self, arg0, arg1, arg2, arg3, arg4, arg5, arg6) > > Now if I call display.draw() or with any arguments it gives an error: > File "/media/Field/lb/pybin/scge.py", line 285, in draw > arg5 : 'float' = 0, arg6 : 'float' = None) -> "void" : return > _scge.display_draw(self, arg0, arg1, arg2, arg3, arg4, arg5, arg6) > NotImplementedError: Wrong number of arguments for overloaded function > 'display_draw'. > Possible C/C++ prototypes are: > draw(display *,float,float,float,float,float,float,float) > draw(display *,float,float,float,float,float,float) > draw(display *,float,float,float,float,float) > draw(display *,float,float,float,float) > draw(display *,float,float,float) > draw(display *,float,float) > draw(display *,float) > draw(display *) > > > If I change that line in the outputted module .py file to read: > def draw(self, *args) -> "void" : return _scge.display_draw(self, *args) > > ...then I can call display.draw() fine. > > Is this a bug? Or something I'm doing wrong? That could be the case as > I've only just started using SWIG 2 days ago, loving it too btw. > This is a bug. Please put it in the SourceForge bug tracker. Strange one as well, it has something to do with the default value, as this fails: struct display { void draw(float = NULL) {} }; and this works as expected: struct display { void draw(float = 0) {} }; If you can't modify the headers you are wrapping, please workaround it using: %feature("compactdefaultargs") display::draw; William |