c# - Swig - generate wrapper to pass an array of struct -
update
i have found out %apply
directive (see here instance). unfortunately can't make work structs:
%module packer_cs %include "carrays.i" %{ #include "packer.h" %} %include "typemaps.i" %include "arrays_csharp.i" %apply image_t input[] { image_t *images } %include "packer.h"
this results in:
swig -csharp -outdir bin\csharp packer\packer.i warning 453: can't apply (image_t input[]). no typemaps defined.
i can't find documentation whatsoever warning. looks have define custom typemap, have no idea start. i'm growing pretty tired of lack of documentation, , pretty desperate of 1 day succeeding in writing wrapper :(
original post
following two previous posts, still have problems using c library in c#.
to recap: have c library, , i'm trying write c# wrapper using swig.
in .h file, method declared such:
int pack(image_t *images, int nb_images, parameters_t params);
actually *images
passed array. if generate swig files this, in c# files, function expects single instance:
public static int pack(image_t images, int nb_images, parameters_t arg2) { int ret = packer_cspinvoke.pack(image_t.getcptr(images), nb_images, parameters_t.getcptr(arg2)); if (packer_cspinvoke.swigpendingexception.pending) throw packer_cspinvoke.swigpendingexception.retrieve(); return ret; }
so, following this comment, have modified .i file such :
%module packer_cs %include <carrays.i> %{ #include "packer.h" %} %include "packer.h" %array_functions(image_t, image_t_array);
now can build "fake" array using new_image_t_array
, image_t_array_setitem
methods, when run test program, throws system.accessviolationexception
(it's trying "read or write protected memory") on pack
method call (c# program):
// "images" variable list<image_t> var images_array = packer_cs.new_image_t_array(images.count); (var = 0; < images.count; i++) { packer_cs.image_t_array_setitem(images_array, i, images[i]); } // throws exception var result = packer_cs.pack(images_array, images.count, param);
actually, exception thrown @ int ret = packer_cspinvoke.pack(image_t.getcptr(images), nb_images, parameters_t.getcptr(arg2));
line in c# file generated swig.
any idea why happening ? said in other posts, know nothing c/c++, pointers , stuff, may obvious...
thanks !
i don't know if matters, can't test, .i might have export pack
function after array_functions:
%module packer_cs %include <carrays.i> %{ #include "packer.h" %} %array_functions(image_t, image_t_array); %include "packer.h"
also, nothing forces declare exact same signature. can have this:
%module packer_cs %include <carrays.i> %{ #include "packer.h" %} // export image_t , parameters_t, then: int pack(image_t images[], int nb_images, parameters_t params);
the wrapper code call c version of pack, giving array, ok because function takes pointer image_t , c knows how works array pointer.
update: since above didn't help, took @ @ arrays_csharp.i
: calls csharp_arrays
, csharp_arrays_fixed
macro on basic types, , .i of arrays example included swig calls apply
nonetheless may %apply
not automatically. in fact, looks these 2 macros are typemaps, think worth try:
%module packer_cs %include "carrays.i" %{ #include "packer.h" %} %include "typemaps.i" %include "arrays_csharp.i" csharp_arrays(image_t, image_t) csharp_arrays_fixed(image_t, image_t) %apply image_t input[] { image_t *images } %include "packer.h"
Comments
Post a Comment