From: Bob H. <bh...@co...> - 2011-07-25 20:54:01
|
I have a structure that contains multiple array members, for example: typedef struct _myStruct { double a1[3]; double a2[5]; [...] } myStruct; In my SWIG interface file, I have defined "memberin" typemaps to make these structure members read/write: [...] %typemap(memberin) double [ANY] { memcpy($1, $input, sizeof(double) * $1_dim0); } [...] This seems to create the proper getters and setters in the generated code: [...] __swig_setmethods__["a1"] = _myNamespace.myStruct_a1_set __swig_getmethods__["a1"] = _myNamespace.myStruct_a1_get if _newclass:a1 = _swig_property(_myNamespace.myStruct_a1_get, _myNamespace.myStruct_a1_set) [...] However, in attempting to access them within Python, I'm getting the 'not subscriptable' error: [...] d1 = myStruct.a1[i] d2 = myStruct.a2[i] [...] What am I doing wrong? |
From: Bob H. <bh...@co...> - 2011-07-25 23:27:50
|
This exhibits in 2.0.4, but I've also built and tried the trunk, and it has the same problem: arg1 = reinterpret_cast< myNamespace::myStructure * >(argp1); [...] { try { result = (int)(arg1)->check(arg2); } catch(Swig::DirectorException &e) { PyErr_SetString(PyExc_RuntimeError, e.getMessage()); } } ... error: expected primary-expression before 'int' ... error: expected ')' before 'int' Visual Studio 2008 compiles this without complaining (which is wrong). I had to compile on the Mac with gcc in order to discover it. |
From: William S F. <ws...@fu...> - 2011-07-28 20:07:32
|
On 26/07/11 00:27, Bob Hood wrote: > This exhibits in 2.0.4, but I've also built and tried the trunk, and it has > the same problem: > > arg1 = reinterpret_cast< myNamespace::myStructure *>(argp1); > [...] > { > try { > result = (int)(arg1)->check(arg2); > } > catch(Swig::DirectorException&e) { > PyErr_SetString(PyExc_RuntimeError, e.getMessage()); > } > } > > ... error: expected primary-expression before 'int' > ... error: expected ')' before 'int' > > Visual Studio 2008 compiles this without complaining (which is wrong). I had > to compile on the Mac with gcc in order to discover it. > How are we supposed to recreate this and help you without any source? You must supply some cutdown standalone code to recreate. William |
From: Bob H. <bh...@co...> - 2011-07-29 01:07:25
|
On 7/28/2011 2:07 PM, William S Fulton wrote: > On 26/07/11 00:27, Bob Hood wrote: >> This exhibits in 2.0.4, but I've also built and tried the trunk, and it has >> the same problem: >> >> arg1 = reinterpret_cast< myNamespace::myStructure *>(argp1); >> [...] >> { >> try { >> result = (int)(arg1)->check(arg2); >> } >> catch(Swig::DirectorException&e) { >> PyErr_SetString(PyExc_RuntimeError, e.getMessage()); >> } >> } >> >> ... error: expected primary-expression before 'int' >> ... error: expected ')' before 'int' >> >> Visual Studio 2008 compiles this without complaining (which is wrong). I had >> to compile on the Mac with gcc in order to discover it. >> > > How are we supposed to recreate this and help you without any source? You > must supply some cutdown standalone code to recreate. Sorry. Here's a test.i interface file: %module (naturalvar="1",directors="1") test # work around a bug in v2.0.4 #if SWIG_VERSION == 0x020004 %typemap(directorin) PyObject * "$input = $1_name;" #endif %include python.swg %include "TestClass.h" Here's the TestClass.h header I used to recreate it: typedef void* TypeID; class TestClass { public: // methods TestClass() {} virtual ~TestClass() {} int check(TypeID) { return 0; } }; SWIG command line: swig -python -c++ -outdir . -o ./test.cpp -naturalvar -noproxydel -I. test.i Here's the entire generated wrapper for the check() call that these two items create: SWIGINTERN PyObject *_wrap_TestClass_check(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; TestClass *arg1 = (TestClass *) 0 ; TypeID arg2 = (TypeID) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:TestClass_check",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_TestClass, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TestClass_check" "', argument " "1"" of type '" "TestClass *""'"); } arg1 = reinterpret_cast< TestClass * >(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TestClass_check" "', argument " "2"" of type '" "TypeID""'"); } result = (int)(arg1)->check(arg2); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } |
From: William S F. <ws...@fu...> - 2011-08-04 05:30:23
|
On 29/07/11 02:07, Bob Hood wrote: > On 7/28/2011 2:07 PM, William S Fulton wrote: >> On 26/07/11 00:27, Bob Hood wrote: >>> This exhibits in 2.0.4, but I've also built and tried the trunk, and it has >>> the same problem: >>> >>> arg1 = reinterpret_cast< myNamespace::myStructure *>(argp1); >>> [...] >>> { >>> try { >>> result = (int)(arg1)->check(arg2); >>> } >>> catch(Swig::DirectorException&e) { >>> PyErr_SetString(PyExc_RuntimeError, e.getMessage()); >>> } >>> } >>> >>> ... error: expected primary-expression before 'int' >>> ... error: expected ')' before 'int' >>> >>> Visual Studio 2008 compiles this without complaining (which is wrong). I had >>> to compile on the Mac with gcc in order to discover it. >>> >> >> How are we supposed to recreate this and help you without any source? You >> must supply some cutdown standalone code to recreate. > > Sorry. Here's a test.i interface file: > > %module (naturalvar="1",directors="1") test > > # work around a bug in v2.0.4 > #if SWIG_VERSION == 0x020004 > %typemap(directorin) PyObject * "$input = $1_name;" > #endif > > %include python.swg > %include "TestClass.h" > > Here's the TestClass.h header I used to recreate it: > > typedef void* TypeID; > > class TestClass > { > public: // methods > TestClass() {} > virtual ~TestClass() {} > > int check(TypeID) { return 0; } > }; > > SWIG command line: > > swig -python -c++ -outdir . -o ./test.cpp -naturalvar -noproxydel -I. test.i > > Here's the entire generated wrapper for the check() call that these two items > create: > > SWIGINTERN PyObject *_wrap_TestClass_check(PyObject *SWIGUNUSEDPARM(self), > PyObject *args) { > PyObject *resultobj = 0; > TestClass *arg1 = (TestClass *) 0 ; > TypeID arg2 = (TypeID) 0 ; > void *argp1 = 0 ; > int res1 = 0 ; > int res2 ; > PyObject * obj0 = 0 ; > PyObject * obj1 = 0 ; > int result; > > if (!PyArg_ParseTuple(args,(char *)"OO:TestClass_check",&obj0,&obj1)) > SWIG_fail; > res1 = SWIG_ConvertPtr(obj0,&argp1,SWIGTYPE_p_TestClass, 0 | 0 ); > if (!SWIG_IsOK(res1)) { > SWIG_exception_fail(SWIG_ArgError(res1), "in method '" > "TestClass_check" "', argument " "1"" of type '" "TestClass *""'"); > } > arg1 = reinterpret_cast< TestClass *>(argp1); > res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); > if (!SWIG_IsOK(res2)) { > SWIG_exception_fail(SWIG_ArgError(res2), "in method '" > "TestClass_check" "', argument " "2"" of type '" "TypeID""'"); > } > result = (int)(arg1)->check(arg2); > resultobj = SWIG_From_int(static_cast< int>(result)); > return resultobj; > fail: > return NULL; > } I can reproduce this snippet of code above with your test case, but it compiles fine with gcc and I can't see anything wrong with it. Can you check your setup and if you think the compiler is correct, describe exactly which line is wrong and why. Also you havn't given the compiler options you are using. I've used: g++ -Wall -Wextra -c -fpic example_wrap.cxx example.cxx -I/usr/include/python2.6 -I/usr/lib/python2.6/config William |
From: Bob H. <bh...@co...> - 2011-08-11 21:46:58
|
On 8/3/2011 11:30 PM, William S Fulton wrote: > On 29/07/11 02:07, Bob Hood wrote: >> On 7/28/2011 2:07 PM, William S Fulton wrote: >>> On 26/07/11 00:27, Bob Hood wrote: >>>> This exhibits in 2.0.4, but I've also built and tried the trunk, and it has >>>> the same problem: >>>> >>>> arg1 = reinterpret_cast< myNamespace::myStructure *>(argp1); >>>> [...] >>>> { >>>> try { >>>> result = (int)(arg1)->check(arg2); >>>> } >>>> catch(Swig::DirectorException&e) { >>>> PyErr_SetString(PyExc_RuntimeError, e.getMessage()); >>>> } >>>> } >>>> >>>> ... error: expected primary-expression before 'int' >>>> ... error: expected ')' before 'int' >>>> >>>> Visual Studio 2008 compiles this without complaining (which is wrong). I >>>> had >>>> to compile on the Mac with gcc in order to discover it. >>>> >>> >>> How are we supposed to recreate this and help you without any source? You >>> must supply some cutdown standalone code to recreate. >> >> Sorry. Here's a test.i interface file: >> >> %module (naturalvar="1",directors="1") test >> >> # work around a bug in v2.0.4 >> #if SWIG_VERSION == 0x020004 >> %typemap(directorin) PyObject * "$input = $1_name;" >> #endif >> >> %include python.swg >> %include "TestClass.h" >> >> Here's the TestClass.h header I used to recreate it: >> >> typedef void* TypeID; >> >> class TestClass >> { >> public: // methods >> TestClass() {} >> virtual ~TestClass() {} >> >> int check(TypeID) { return 0; } >> }; >> >> SWIG command line: >> >> swig -python -c++ -outdir . -o ./test.cpp -naturalvar -noproxydel -I. >> test.i >> >> Here's the entire generated wrapper for the check() call that these two items >> create: >> >> SWIGINTERN PyObject *_wrap_TestClass_check(PyObject >> *SWIGUNUSEDPARM(self), >> PyObject *args) { >> PyObject *resultobj = 0; >> TestClass *arg1 = (TestClass *) 0 ; >> TypeID arg2 = (TypeID) 0 ; >> void *argp1 = 0 ; >> int res1 = 0 ; >> int res2 ; >> PyObject * obj0 = 0 ; >> PyObject * obj1 = 0 ; >> int result; >> >> if (!PyArg_ParseTuple(args,(char *)"OO:TestClass_check",&obj0,&obj1)) >> SWIG_fail; >> res1 = SWIG_ConvertPtr(obj0,&argp1,SWIGTYPE_p_TestClass, 0 | 0 ); >> if (!SWIG_IsOK(res1)) { >> SWIG_exception_fail(SWIG_ArgError(res1), "in method '" >> "TestClass_check" "', argument " "1"" of type '" "TestClass *""'"); >> } >> arg1 = reinterpret_cast< TestClass *>(argp1); >> res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); >> if (!SWIG_IsOK(res2)) { >> SWIG_exception_fail(SWIG_ArgError(res2), "in method '" >> "TestClass_check" "', argument " "2"" of type '" "TypeID""'"); >> } >> result = (int)(arg1)->check(arg2); >> resultobj = SWIG_From_int(static_cast< int>(result)); >> return resultobj; >> fail: >> return NULL; >> } > > I can reproduce this snippet of code above with your test case, but it > compiles fine with gcc and I can't see anything wrong with it. Can you check > your setup and if you think the compiler is correct, describe exactly which > line is wrong and why. Also you havn't given the compiler options you are > using. I've used: > > g++ -Wall -Wextra -c -fpic example_wrap.cxx example.cxx > -I/usr/include/python2.6 -I/usr/lib/python2.6/config Just FYI: I'm still looking into this. So far, I have found that a greatly simplified version of this (the original output file's is over 122,000 lines) that produces exactly the same code for the _wrap_TestClass_check() function compiles without complaint. If I take the code verbatim from the test and transplant it into the behemoth output file, /replacing the exact same code/, it fails with the same error. Further, I re-formatted the offending line to be: result = (int)(arg1->check(arg2)); And GCC then complains that my class has no "member named 'check'" (when it obviously does). Just for giggles, I renamed the class method from "check" to "check_" in the header, and manually changed the emitted SWIG code to reflect this, using the original offending format: result = (int)(arg1)->check_(arg2); And it compiles just fine. Huh? O_o I don't know what the hell is going on here. There no overloaded method with that name in my header (there are no overloaded methods at all). Keyword problems? GCC brain damage? File too big? Render me gone, ||| Bob ^(===)^ ---------------------------------oOO--(_)--OOo--------------------------------- "One of the penalties for refusing to participate in politics is that you end up being governed by your inferiors." -- /Plato/ |
From: William S F. <ws...@fu...> - 2011-08-17 22:00:40
|
On 11/08/11 22:46, Bob Hood wrote: > On 8/3/2011 11:30 PM, William S Fulton wrote: >> On 29/07/11 02:07, Bob Hood wrote: >>> On 7/28/2011 2:07 PM, William S Fulton wrote: >>>> On 26/07/11 00:27, Bob Hood wrote: >>>>> This exhibits in 2.0.4, but I've also built and tried the trunk, >>>>> and it has >>>>> the same problem: >>>>> >>>>> arg1 = reinterpret_cast< myNamespace::myStructure *>(argp1); >>>>> [...] >>>>> { >>>>> try { >>>>> result = (int)(arg1)->check(arg2); >>>>> } >>>>> catch(Swig::DirectorException&e) { >>>>> PyErr_SetString(PyExc_RuntimeError, e.getMessage()); >>>>> } >>>>> } >>>>> >>>>> ... error: expected primary-expression before 'int' >>>>> ... error: expected ')' before 'int' >>>>> >>>>> Visual Studio 2008 compiles this without complaining (which is >>>>> wrong). I had >>>>> to compile on the Mac with gcc in order to discover it. >>>>> >>>> >>>> How are we supposed to recreate this and help you without any >>>> source? You >>>> must supply some cutdown standalone code to recreate. >>> >>> Sorry. Here's a test.i interface file: >>> >>> %module (naturalvar="1",directors="1") test >>> >>> # work around a bug in v2.0.4 >>> #if SWIG_VERSION == 0x020004 >>> %typemap(directorin) PyObject * "$input = $1_name;" >>> #endif >>> >>> %include python.swg >>> %include "TestClass.h" >>> >>> Here's the TestClass.h header I used to recreate it: >>> >>> typedef void* TypeID; >>> >>> class TestClass >>> { >>> public: // methods >>> TestClass() {} >>> virtual ~TestClass() {} >>> >>> int check(TypeID) { return 0; } >>> }; >>> >>> SWIG command line: >>> >>> swig -python -c++ -outdir . -o ./test.cpp -naturalvar -noproxydel -I. >>> test.i >>> >>> Here's the entire generated wrapper for the check() call that these >>> two items >>> create: >>> >>> SWIGINTERN PyObject *_wrap_TestClass_check(PyObject >>> *SWIGUNUSEDPARM(self), >>> PyObject *args) { >>> PyObject *resultobj = 0; >>> TestClass *arg1 = (TestClass *) 0 ; >>> TypeID arg2 = (TypeID) 0 ; >>> void *argp1 = 0 ; >>> int res1 = 0 ; >>> int res2 ; >>> PyObject * obj0 = 0 ; >>> PyObject * obj1 = 0 ; >>> int result; >>> >>> if (!PyArg_ParseTuple(args,(char *)"OO:TestClass_check",&obj0,&obj1)) >>> SWIG_fail; >>> res1 = SWIG_ConvertPtr(obj0,&argp1,SWIGTYPE_p_TestClass, 0 | 0 ); >>> if (!SWIG_IsOK(res1)) { >>> SWIG_exception_fail(SWIG_ArgError(res1), "in method '" >>> "TestClass_check" "', argument " "1"" of type '" "TestClass *""'"); >>> } >>> arg1 = reinterpret_cast< TestClass *>(argp1); >>> res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); >>> if (!SWIG_IsOK(res2)) { >>> SWIG_exception_fail(SWIG_ArgError(res2), "in method '" >>> "TestClass_check" "', argument " "2"" of type '" "TypeID""'"); >>> } >>> result = (int)(arg1)->check(arg2); >>> resultobj = SWIG_From_int(static_cast< int>(result)); >>> return resultobj; >>> fail: >>> return NULL; >>> } >> >> I can reproduce this snippet of code above with your test case, but it >> compiles fine with gcc and I can't see anything wrong with it. Can you >> check your setup and if you think the compiler is correct, describe >> exactly which line is wrong and why. Also you havn't given the >> compiler options you are using. I've used: >> >> g++ -Wall -Wextra -c -fpic example_wrap.cxx example.cxx >> -I/usr/include/python2.6 -I/usr/lib/python2.6/config > > Just FYI: I'm still looking into this. > > So far, I have found that a greatly simplified version of this (the > original output file's is over 122,000 lines) that produces exactly the > same code for the _wrap_TestClass_check() function compiles without > complaint. If I take the code verbatim from the test and transplant it > into the behemoth output file, /replacing the exact same code/, it fails > with the same error. > > Further, I re-formatted the offending line to be: > > result = (int)(arg1->check(arg2)); > > And GCC then complains that my class has no "member named 'check'" (when > it obviously does). > > Just for giggles, I renamed the class method from "check" to "check_" in > the header, and manually changed the emitted SWIG code to reflect this, > using the original offending format: > > result = (int)(arg1)->check_(arg2); > > And it compiles just fine. Huh? O_o > > I don't know what the hell is going on here. There no overloaded method > with that name in my header (there are no overloaded methods at all). > Keyword problems? GCC brain damage? File too big? > Look at the preprocessed output with gcc -E. Probably there is some macro changing check into something else in your code. William |
From: Bob H. <bh...@co...> - 2011-08-17 22:32:46
|
On 8/17/2011 4:00 PM, William S Fulton wrote: > On 11/08/11 22:46, Bob Hood wrote: >> On 8/3/2011 11:30 PM, William S Fulton wrote: >>> On 29/07/11 02:07, Bob Hood wrote: >>>> On 7/28/2011 2:07 PM, William S Fulton wrote: >>>>> On 26/07/11 00:27, Bob Hood wrote: >>>>>> This exhibits in 2.0.4, but I've also built and tried the trunk, >>>>>> and it has >>>>>> the same problem: >>>>>> >>>>>> arg1 = reinterpret_cast< myNamespace::myStructure *>(argp1); >>>>>> [...] >>>>>> { >>>>>> try { >>>>>> result = (int)(arg1)->check(arg2); >>>>>> } >>>>>> catch(Swig::DirectorException&e) { >>>>>> PyErr_SetString(PyExc_RuntimeError, e.getMessage()); >>>>>> } >>>>>> } >>>>>> >>>>>> ... error: expected primary-expression before 'int' >>>>>> ... error: expected ')' before 'int' >>>>>> >>>>>> Visual Studio 2008 compiles this without complaining (which is >>>>>> wrong). I had >>>>>> to compile on the Mac with gcc in order to discover it. >>>>>> >>>>> >>>>> How are we supposed to recreate this and help you without any >>>>> source? You >>>>> must supply some cutdown standalone code to recreate. >>>> >>>> Sorry. Here's a test.i interface file: >>>> >>>> %module (naturalvar="1",directors="1") test >>>> >>>> # work around a bug in v2.0.4 >>>> #if SWIG_VERSION == 0x020004 >>>> %typemap(directorin) PyObject * "$input = $1_name;" >>>> #endif >>>> >>>> %include python.swg >>>> %include "TestClass.h" >>>> >>>> Here's the TestClass.h header I used to recreate it: >>>> >>>> typedef void* TypeID; >>>> >>>> class TestClass >>>> { >>>> public: // methods >>>> TestClass() {} >>>> virtual ~TestClass() {} >>>> >>>> int check(TypeID) { return 0; } >>>> }; >>>> >>>> SWIG command line: >>>> >>>> swig -python -c++ -outdir . -o ./test.cpp -naturalvar -noproxydel -I. >>>> test.i >>>> >>>> Here's the entire generated wrapper for the check() call that these >>>> two items >>>> create: >>>> >>>> SWIGINTERN PyObject *_wrap_TestClass_check(PyObject >>>> *SWIGUNUSEDPARM(self), >>>> PyObject *args) { >>>> PyObject *resultobj = 0; >>>> TestClass *arg1 = (TestClass *) 0 ; >>>> TypeID arg2 = (TypeID) 0 ; >>>> void *argp1 = 0 ; >>>> int res1 = 0 ; >>>> int res2 ; >>>> PyObject * obj0 = 0 ; >>>> PyObject * obj1 = 0 ; >>>> int result; >>>> >>>> if (!PyArg_ParseTuple(args,(char *)"OO:TestClass_check",&obj0,&obj1)) >>>> SWIG_fail; >>>> res1 = SWIG_ConvertPtr(obj0,&argp1,SWIGTYPE_p_TestClass, 0 | 0 ); >>>> if (!SWIG_IsOK(res1)) { >>>> SWIG_exception_fail(SWIG_ArgError(res1), "in method '" >>>> "TestClass_check" "', argument " "1"" of type '" "TestClass *""'"); >>>> } >>>> arg1 = reinterpret_cast< TestClass *>(argp1); >>>> res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); >>>> if (!SWIG_IsOK(res2)) { >>>> SWIG_exception_fail(SWIG_ArgError(res2), "in method '" >>>> "TestClass_check" "', argument " "2"" of type '" "TypeID""'"); >>>> } >>>> result = (int)(arg1)->check(arg2); >>>> resultobj = SWIG_From_int(static_cast< int>(result)); >>>> return resultobj; >>>> fail: >>>> return NULL; >>>> } >>> >>> I can reproduce this snippet of code above with your test case, but it >>> compiles fine with gcc and I can't see anything wrong with it. Can you >>> check your setup and if you think the compiler is correct, describe >>> exactly which line is wrong and why. Also you havn't given the >>> compiler options you are using. I've used: >>> >>> g++ -Wall -Wextra -c -fpic example_wrap.cxx example.cxx >>> -I/usr/include/python2.6 -I/usr/lib/python2.6/config >> >> Just FYI: I'm still looking into this. >> >> So far, I have found that a greatly simplified version of this (the >> original output file's is over 122,000 lines) that produces exactly the >> same code for the _wrap_TestClass_check() function compiles without >> complaint. If I take the code verbatim from the test and transplant it >> into the behemoth output file, /replacing the exact same code/, it fails >> with the same error. >> >> Further, I re-formatted the offending line to be: >> >> result = (int)(arg1->check(arg2)); >> >> And GCC then complains that my class has no "member named 'check'" (when >> it obviously does). >> >> Just for giggles, I renamed the class method from "check" to "check_" in >> the header, and manually changed the emitted SWIG code to reflect this, >> using the original offending format: >> >> result = (int)(arg1)->check_(arg2); >> >> And it compiles just fine. Huh? O_o >> >> I don't know what the hell is going on here. There no overloaded method >> with that name in my header (there are no overloaded methods at all). >> Keyword problems? GCC brain damage? File too big? >> > > Look at the preprocessed output with gcc -E. Probably there is some macro > changing check into something else in your code. > Hey, William. I have been able to verify with a Mac developer that this is an issue GCC has with methods (or functions) named "check" (he's experienced it as well). He suggests that it is some kind of intermittent conflict with some debugging stuff in the Xcode environment. At any rate, I worked around this by making my metadata generator detect functions with the name "check", rename them to "check_" when they are wrapped as class methods, and then emit SWIG code that causes them to be renamed back to "check" within the Python environment. Seems to work alright. Render me gone, ||| Bob ^(===)^ ---------------------------------oOO--(_)--OOo--------------------------------- "One of the penalties for refusing to participate in politics is that you end up being governed by your inferiors." -- /Plato/ |
From: Bob H. <bh...@co...> - 2011-07-28 01:03:25
|
On 7/26/2011 2:33 PM, Stefan Zager wrote: > The problem is that you haven't defined indexing operators for type double[]. Hi, Stefan. Thanks for the reply. Hmm, this isn't very clear to me. I thought SWIG generated that sort of thing automatically when it found a <type>[<size>] declaration. Is there some example to which you can point me in the SWIG distribution (or documentation) that illustrates this? Or, if not, could you perhaps give me a brief example? I really appreciate your time. |
From: Bob H. <bh...@co...> - 2011-07-29 00:50:01
|
On 7/27/2011 7:03 PM, Bob Hood wrote: > On 7/26/2011 2:33 PM, Stefan Zager wrote: >> The problem is that you haven't defined indexing operators for type double[]. > > Hi, Stefan. Thanks for the reply. > > Hmm, this isn't very clear to me. I thought SWIG generated that sort of thing > automatically when it found a <type>[<size>] declaration. Is there some > example to which you can point me in the SWIG distribution (or documentation) > that illustrates this? Or, if not, could you perhaps give me a brief example? > > I really appreciate your time. I have addressed this (I guess) with an "out" typemap, for example: %typemap(out) double [ANY] { $result = PyList_New($1_dim0); for(int i = 0; i < $1_dim0; i++) { PyObject *o = PyFloat_FromDouble((double)$1[i]); PyList_SetItem($result, i, o); } } But this seems like a really inefficient approach. It means that Python code like this: for i in range(3): ms.a1[i] = ms.a1[i] * (i * i) is going to be copying and releasing whole lists at a time (assuming it even works to begin with). I tried extending the class with my own "get" and "set" methods: %extend myStruct { double a1_get(int i) { return self->a1[i]; } void a1_set(int i, double v) { self->a1[i] = v; } } But that ended in disaster (they're already defined for the class). Is there a better way to do this that I'm missing, one that just accesses, and returns, the individual elements of the wrapped double*, instead of the entire array each time? Or is the whole-list-each-time approach as good as it gets? |
From: Bob H. <bh...@co...> - 2011-07-29 04:23:43
|
On 7/28/2011 6:50 PM, Bob Hood wrote: > On 7/27/2011 7:03 PM, Bob Hood wrote: >> On 7/26/2011 2:33 PM, Stefan Zager wrote: >>> The problem is that you haven't defined indexing operators for type double[]. >> >> Hi, Stefan. Thanks for the reply. >> >> Hmm, this isn't very clear to me. I thought SWIG generated that sort of thing >> automatically when it found a <type>[<size>] declaration. Is there some >> example to which you can point me in the SWIG distribution (or documentation) >> that illustrates this? Or, if not, could you perhaps give me a brief example? >> >> I really appreciate your time. > > I have addressed this (I guess) with an "out" typemap, for example: > > %typemap(out) double [ANY] { > $result = PyList_New($1_dim0); > for(int i = 0; i < $1_dim0; i++) > { > PyObject *o = PyFloat_FromDouble((double)$1[i]); > PyList_SetItem($result, i, o); > } > } > > But this seems like a really inefficient approach. It means that Python code > like this: > > for i in range(3): > ms.a1[i] = ms.a1[i] * (i * i) > > is going to be copying and releasing whole lists at a time (assuming it even > works to begin with)... Confirmed: It doesn't. The array has to be "pulled out" first, and then "put back in" afterward to actually work: values = ms.a1 for i in range(3): values[i] = values[i] * (i * i) ms.a1 = values This is awkward. I need some help here, please. |
From: Stefan Z. <sz...@gm...> - 2011-08-03 14:57:05
|
On Thu, Jul 28, 2011 at 9:24 PM, Bob Hood <bh...@co...> wrote: > > is going to be copying and releasing whole lists at a time (assuming it > even > > works to begin with)... > > Confirmed: It doesn't. The array has to be "pulled out" first, and then > "put > back in" afterward to actually work: > > values = ms.a1 > for i in range(3): > values[i] = values[i] * (i * i) > ms.a1 = values > > This is awkward. > > I need some help here, please.\ > Bob, The short answer, I think, is that the behavior you want is not supported (and it would be very tricky to do so). Stefan |
From: Bob H. <bh...@co...> - 2011-08-03 18:47:26
|
On 8/3/2011 8:56 AM, Stefan Zager wrote: > On Thu, Jul 28, 2011 at 9:24 PM, Bob Hood <bh...@co... > <mailto:bh...@co...>> wrote: > > > > is going to be copying and releasing whole lists at a time (assuming > it even > > works to begin with)... > > Confirmed: It doesn't. The array has to be "pulled out" first, and > then "put > back in" afterward to actually work: > > values = ms.a1 > for i in range(3): > values[i] = values[i] * (i * i) > ms.a1 = values > > This is awkward. > > I need some help here, please.\ > > > Bob, > > The short answer, I think, is that the behavior you want is not supported > (and it would be very tricky to do so). > Ugh. I was afraid that was going to be the answer. Maybe I'll have some time after I finish this integration to look at a way to make that work the way I expect it to. Thanks for the confirmation, Stefan. |