newbie at SWIG, help needed with typemaps

Josh mlsj at earthlink.net
Sun Mar 30 11:45:59 EST 2003


I hope this is not OT in this group. If it is, do let me know and I'll try 
my luck elsewhere. I have a simple C function. When called from a C 
program, void carr is handed a properly malloc'ed double pointer and an int 
len. carr then proceeds to fill up the first len locations of the double 
array represented by double *sd. When called from python, I just want to 
pass the len as in (in module trl) trl.carr(len). In that case, the wrapped 
C function should then proceed to dynamically allocate the double array, 
fill it up, convert it to a Python object, and return a list of  len 
elements. Does that make sense? I have been trying to fool around with 
%typemaps, %inline, %rename and everything else for the last two days and 
getting nowhere. 

The C function is:

void carr(int len,double *sd)
{
   int i=0;
   
   for(i=0;i<len;i++){
	   *sd++=i*0.2334;
   }
   sd-=len-1;
   }

What I want is :

s=trl.carr(len)
s=list of double values(or Python float)

Here is the interface file that comes closest to what I want to do .However 
this necessitates me fooling around with the wrap_carr(..) function to get 
the behavior I want. Can somebody help? And if this is OT, please point me 
in the right direction.

%module trl

%rename(carr) wrap_carr;
%typemap(in)int len(double *d){
$1=PyInt_AsLong($input);
arg2=(double *)malloc($1*sizeof(double));

}


%typemap(argout) (double *OutValue) {
int i;
PyObject *o;
PyObject *d;
o=PyList_New($1);
for(i=0;i<$1;i++)
{
d=PyFloat_FromDouble(arg2[i]);
PyList_Append(o, d);
}
$result=o;

}




More information about the Python-list mailing list