From: Mistervanhalen <mis...@gm...> - 2007-10-03 21:20:24
|
Thank you Chris. We tried your code but some issues persist.=20 Here is our test code : test.c ----------------------------------------- #include <stdlib.h> #include <stdio.h> #include "utils.h" void superfonction (int tata,int **matrix){ matrix[0][0]=3D6; matrix[0][1]=3D2; /*...*/ } int main(void){ int tata=3D2; int **matrix; matrix=3DAllocMemory(2,3); superfonction(tata,matrix); DesallocMemory(matrix,2); return (1); } I'd like to receive the matrix in python without giving any during the call of the function in C. test.i -------------------------------- %module libTATA extern void superfonction(int tata,int **OUTPUT); %rename (superfonction) my_fct; %inline%{ void my_fct(int DIM1,int *IN_ARRAY2){ return my_fct(DIM1,IN_ARRAY2); =09} %} ----------------------------- SHELL /$ swig -python test.i /$ gcc -c test.c -Wall -fPIC /$ gcc -c test_wrap.c -I/usr/include/python -fPIC -Wall ---> Warning test_wrap.c: In function =E2=80=98_wrap_superfonction__SWIG_= 0=E2=80=99: test_wrap.c:2650: warning: implicit declaration of function =E2=80=98superf= onction=E2=80=99 /$ gcc -c utils.c -Wall -fPIC /$ gcc -o _libTATA test.o .test_wrap.o utils.o -shared /$python >>>import libTATA >>>import numpy >>>libTATA.superfonction(2) TypeError: superfonction() takes exactly 2 arguments (1 given) Here is our issue ! Thank for your help. Mister Christopher Barker wrote: >=20 > Mistervanhalen wrote: >> Thank you for your answer. >> My C prototype function is >>=20 >> void fct(int a,int **matrix) >> And I want to get matrix in python >=20 > so matrix is a pointer to a pointer -- how is the memory laid out? Is=20 > is a single block of data? Easiest is a C or Fortran style contiguous > array. >=20 > You'll be glad if you implement this with numpy arrays. Start by reading= =20 > the docs here: >=20 > http://svn.scipy.org/svn/numpy/trunk/numpy/doc/swig/doc/ >=20 > If you install numpy, you'll have these docs (and numpy.i) on your system= . >=20 >> extern void fct(int a, int **OUTPUT); >=20 > You'll probably want to use the INPLACE_ARRAY2 typemap, and to do that,= =20 > you'll have to wrap your function in one that uses both dimensions (I'm= =20 > assuming your matrix is square. See the docs, but it will look something= =20 > like: >=20 >=20 > %rename (fct) my_fct; > %inline %{ > void my_fct(int DIM1, int DIM2, int* IN_ARRAY2)) { > if (DIM1 !=3D DIM2) { > PyErr_Format(PyExc_ValueError, > "Input array must be square"); > return; > } > return fct(DIM1, IN_ARRAY2); > /* I haven't done the referencing of the ** right here */ > } > %} >=20 > SWIG is pretty complicated -- it will do you good to read through the=20 > intro docs first, and try a few simple examples to get the idea. Then=20 > try some of the numpy.i examples. (I have a few of these I could send=20 > you if you want) >=20 > -Chris >=20 > --=20 > Christopher Barker, Ph.D. > Oceanographer >=20 > Emergency Response Division > NOAA/NOS/OR&R (206) 526-6959 voice > 7600 Sand Point Way NE (206) 526-6329 fax > Seattle, WA 98115 (206) 526-6317 main reception >=20 > Chr...@no... >=20 > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user >=20 >=20 --=20 View this message in context: http://www.nabble.com/receive-bidimensional-a= rray-from-C-in-Python-using-SWIG-tf4562645.html#a13028028 Sent from the swig-user mailing list archive at Nabble.com. |