On Mar 14, 5:22 am, Matteo <tadweles...@gmail.com> wrote:
> Re-posting in more simple and precise terms from a previous 
> threadhttp://groups.google.it/group/comp.lang.python/browse_thread/thread/6...
>
> Problem:
> SWIG doesn't properly wrap c++ arrays of pointers, therefore when you
> try to call a c++ function which requires them, a TypeError exception
> is raised.
>
> Similar story here:http://osdir.com/ml/programming.swig/2003-02/msg00064.html
>
> Already tried:
> - some ctypes functions
> - tuple or string instead of list
>
> Possibile solutions:
> something 
> likehttp://embedded.eecs.berkeley.edu/Alumni/pinhong/scriptEDA/pyTypemapF...
> that didn't work either, but I think I was not able to adapt the code
> to my case, since the example is poorly explained.
>
> Code to reproduce error:
> I made a dptest.cpp function that calculates the sum of an array of
> pointers to ints.
>
> #include "dptest.h"
> //the header file is just
> //int sum(int**, int);
>
> int sum(int** dp, int len){
>         int sum = 0;
>         for (int i = 0; i < len; i++){
>                 sum += *(dp[i]);
>         }
>         return sum;
>
> }
>
> swig -c++ -python, then setup.py build_ext --inplace gets it nicely
> compiled and wrapped for python use. It also is imported without
> problems, but then...
>
> mat...@matteo:~/lab/sandbox$ python
> Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
> [GCC 4.3.2] on linux2
> Type "help", "copyright", "credits" or "license" for more information.>>> 
> import dptest as dp
> >>> l = [1, 2, 3, 4]
> >>> size = len(l)
> >>> dp.sum(l,size)
>
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: in method 'sum', argument 1 of type 'int **'
>
> NOTE: A pure c++ program works as expected:
>
> #include <iostream>
>
> int sum(int**, int);
>
> int main(){
>     int **array_of_ptr = new int*[4];
>     for (int i = 0; i < 4; i++){
>         array_of_ptr[i] = new int;
>         *array_of_ptr[i] = i+1; //fill it with 1,2,3,4: 1+2+3+4 = 10
>     }
>     std::cout << sum(array_of_ptr, 4) << std::endl;
>
> }
>
> int sum(int** dp, int len){
>         int sum = 0;
>         for (int i = 0; i < len; i++){
>                 sum += *(dp[i]);
>         }
>         return sum;
>
> }
>
> compiling and running prints the correct result:
> mat...@matteo:~/lab/sandbox$ ./purecpp
> 10


Depending on what you are wanting to accomplish with your SWIG library
you may be able to more easily glue your Python code to the C++ piece
using SIMPL (http://www.icanprogram.com/simpl).    SIMPL is an ultra
lightweight toolkit useful for gluing modules written in different
languages (C, C++, Python, Tcl/Tk, JAVA) using Send/Receive/Reply
messaging first pioneered by QNX.

If you think SIMPL might help,  don't hesitate to contact me offlist
at this email address.

bob
SIMPL project coordinator
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to