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

Matteo tadwelessar at gmail.com
Sat Mar 14 06:22:45 EDT 2009


Re-posting in more simple and precise terms from a previous thread
http://groups.google.it/group/comp.lang.python/browse_thread/thread/6dd7bd9a09b8a011/5119cf15ebfa38b8

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 like http://embedded.eecs.berkeley.edu/Alumni/pinhong/scriptEDA/pyTypemapFAQ.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 at 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 at matteo:~/lab/sandbox$ ./purecpp
10



More information about the Python-list mailing list