Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > SWIG, c++ to Python: array of pointers (double pointer) not working

Reply
Thread Tools

SWIG, c++ to Python: array of pointers (double pointer) not working

 
 
Matteo
Guest
Posts: n/a
 
      03-14-2009
Re-posting in more simple and precise terms from a previous thread
http://groups.google.it/group/comp.l...19cf15ebfa38b8

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.../msg00064.html

Already tried:
- some ctypes functions
- tuple or string instead of list

Possibile solutions:
something like http://embedded.eecs.berkeley.edu/Al...mapFAQ.html#20
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...

matteo@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:
matteo@matteo:~/lab/sandbox$ ./purecpp
10
 
Reply With Quote
 
 
 
 
bobicanprogram
Guest
Posts: n/a
 
      03-17-2009
On Mar 14, 5:22 am, Matteo <(E-Mail Removed)> 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.../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...
>
> matteo@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:
> matteo@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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Do not cast pointers to functions to pointers to primitive types ajaybgr C Programming 18 09-07-2012 04:34 AM
pointers, pointers, pointers... cerr C Programming 12 04-07-2011 11:17 PM
pointers and array of pointers Piotrek C Programming 8 04-06-2007 08:02 AM
Pointers, linked list, array of pointers Sean C++ 2 09-24-2006 01:35 PM
Can a static array contain a dynamic array of pointers? Peter B. Steiger C Programming 8 04-26-2004 03:07 AM



Advertisments