From: <mark@GOSSAGE.cjb.net> - 2006-07-21 01:59:37
|
Hello Lyte, The link you provided: > http://sourceforge.net/mailarchive/forum.php?thread_id=9327385&forum_id=46074 Does cover the matter, though it may not be very clear. Take your example: int Create_Math(iMath** pptr); I am assuming that this is a factory function which returns newly allocated data. (ie. we need to tell Lua to manage the data for us). I am also assuming the function is output only, and you don't actually pass anything important inside. The following typemap will handle this pointer-pointer: %typemap(in,numinputs=0) SWIGTYPE** OUTPUT ($*ltype temp) %{ $1 = &temp; %} %typemap(argout) SWIGTYPE** OUTPUT %{SWIG_NewPointerObj(L,*$1,$*descriptor,1); SWIG_arg++; %} (note: the 1 parameter in the SWIG_NewPointerObj specifies that the memorry should be managed). What this code will do is to automatically provide the pointer in, and then return the pointer as the end of the function. If this is unclear try looking at the code --------demo.i---------- %module demo %{ #include <malloc.h> %} // this is the general ptr-ptr typemap %typemap(in,numinputs=0) SWIGTYPE** OUTPUT ($*ltype temp) %{ $1 = &temp; %} %typemap(argout) SWIGTYPE** OUTPUT %{SWIG_NewPointerObj(L,*$1,$*descriptor,1); SWIG_arg++; %} // this tell SWIG to use this pointer on any function which has a // {iMath **pptr } in its parameters %apply SWIGTYPE** OUTPUT{iMath **pptr }; %inline %{ // here is a simplified struct for demo typedef struct{ int val; }iMath; // here is the factory function int Create_Math(iMath** pptr){ *pptr=(iMath*)malloc(sizeof(iMath)); (*pptr)->val=1; return 1; } %} ---------------------------- You can compile this down with SWIG, and try this test program. --demo_runme.lua------------- require("demo") a,b=demo.Create_Math() -- a is the int, b is a iMath* print(a,b) -- gives 1, userdata print(type(a),type(b)) -- gives 'number' 'userdata' print(swig_type(b)) -- gives '_p_iMath' print(b.val) -- gives 1 ---------------------- Let me know how this works, and if I am not clear (which is quite possible). Please feel free to ask. Regards, Mark |