From: Mathieu M. <mat...@gm...> - 2008-12-10 10:21:18
|
Hi there, I would like to wrap something like this in C#: const double *get6() { static const double bla[6] = {}; return bla; } I would like to tell the wrapped layer that this is an array of 6 elements (no more, no less). Could someone please point me to the documentation for this. All I can find is something related to python (not C#). * http://www.swig.org/Doc1.3/Typemaps.html#Typemaps_nn40 the only other ref I found was for an external project (GDAL): * http://lists.osgeo.org/pipermail/gdal-dev/2005-September/006559.html thank you. -- Mathieu |
From: Antti K. <ant...@na...> - 2008-12-11 06:35:31
|
On Wed, 10 Dec 2008 12:21:06 +0200, Mathieu Malaterre <mathieu.malaterre@xxxx> wrote: > I would like to wrap something like this in C#: > > const double *get6() > { > static const double bla[6] = {}; > return bla; > } > > I would like to tell the wrapped layer that this is an array of 6 > elements (no more, no less). > > Could someone please point me to the documentation for this. All I can > find is something related to python (not C#). Arrays are supported in swig svn head. If you want to use the current release you have to make your own typemaps (or copy paste from svn head. Note that the FIXED typemaps won't work on curren't swig release). See documentation about handling arrays https://swig.svn.sourceforge.net/svnroot/swig/trunk/Doc/Manual/CSharp.html and the typemaps https://swig.svn.sourceforge.net/svnroot/swig/trunk/Lib/csharp/arrays_csharp.i There's support only for array parameters, though. If you need support for array return values, I think you have to roll your own typemaps. Or, you can write a simple wrapper function that copies the content of the returned array to a parameter array, e.g. void get6_helper( double* bla ) { double originals = get6() ; memcpy( bla, originals, 6 * sizeof( double ) ) ; } and wrap that using the provided typemaps. ::Antti:: |
From: Mathieu M. <mat...@gm...> - 2008-12-11 12:37:57
|
On Thu, Dec 11, 2008 at 7:35 AM, Antti Karanta <ant...@na...> wrote: > > On Wed, 10 Dec 2008 12:21:06 +0200, Mathieu Malaterre > <mathieu.malaterre@xxxx> wrote: > >> I would like to wrap something like this in C#: >> >> const double *get6() >> { >> static const double bla[6] = {}; >> return bla; >> } >> >> I would like to tell the wrapped layer that this is an array of 6 >> elements (no more, no less). >> >> Could someone please point me to the documentation for this. All I can >> find is something related to python (not C#). > > Arrays are supported in swig svn head. If you want to use the current > release you have to make your own typemaps (or copy paste from svn head. > Note that the FIXED typemaps won't work on curren't swig release). > > See documentation about handling arrays > https://swig.svn.sourceforge.net/svnroot/swig/trunk/Doc/Manual/CSharp.html > and the typemaps > https://swig.svn.sourceforge.net/svnroot/swig/trunk/Lib/csharp/arrays_csharp.i > > There's support only for array parameters, though. If you need support > for array return values, I think you have to roll your own typemaps. > > Or, you can write a simple wrapper function that copies the content of > the returned array to a parameter array, e.g. > > void get6_helper( double* bla ) { > double originals = get6() ; > memcpy( bla, originals, 6 * sizeof( double ) ) ; > } > > and wrap that using the provided typemaps. The svnroot link did not work for me (HTML would not be rendered) instead I had to use: http://swig.svn.sourceforge.net/viewvc/swig/trunk/Doc/Manual/CSharp.html Anyway thanks for the link, but I still do not see how to remap the function parameter as a return arg in the C# later. I would like to use the get6() function in C# (for consistency in the different wrapped language): uint[] out = get6(); Thanks again ! -- Mathieu |
From: Antti K. <ant...@na...> - 2008-12-12 06:41:07
|
On Thu, 11 Dec 2008 14:37:47 +0200, Mathieu Malaterre <mathieu.malaterre@xxxx> wrote: > Anyway thanks for the link, but I still do not see how to remap the > function parameter as a return arg in the C# later. %apply double OUTPUT[] { double* bla } > I would like to use the get6() function in C# (for consistency in the > different wrapped language): > > uint[] out = get6(); As get6 is really returning a pointer to an array (instead of returning a fixed size array on stack), you could construct a typemap that gets the pointer to the c# side and there via "unsafe" code reads the data into an array and returns that. Something like this: %typemap(ctype) double *MYOUTARRAY6 "double*" %typemap(imtype) double *MYOUTARRAY6 "double*" %typemap(cstype) double *MYOUTARRAY6 "double*" %typemap(csout) double *MYOUTARRAY6 { double* dvals6 = $imcall ; double[] rval = new double[ 6 ] ; for ( int i = 0 ; i < 6 ; i++ ) rval[ i ] = dvals6[ i ] ; return drval ; } Remember that you have to mark your intermediate class method unsafe as you are handling pointers: %csmethodmodifiers "public unsafe" get6 %apply double *MYOUTARRAY6 { get6 } There may be errors as I did not test the code, but you get the idea. ::Antti:: |