<html> <head> <title>SWIG:Examples:tcl:funcptr</title> </head> <body bgcolor="#ffffff"> <tt>SWIG/Examples/tcl/funcptr/</tt> <hr> <H2>Pointers to Functions</H2> <tt>$Header: /cvs/projects/SWIG/Examples/tcl/funcptr/index.html,v 1.1 2000/09/04 15:54:56 beazley Exp $</tt><br> <p> Okay, just what in the heck does SWIG do with a declaration like this? <blockquote> <pre> int do_op(int a, int b, int (*op)(int, int)); </pre> </blockquote> Well, it creates a wrapper as usual. Of course, that does raise some questions about the third argument (the pointer to a function). <p> In this case, SWIG will wrap the function pointer as it does for all other pointers. However, in order to actually call this function from a script, you will need to pass some kind of C function pointer object. In C, this is easy, you just supply a function name as an argument like this: <blockquote> <pre> /* Some callback function */ int add(int a, int b) { return a+b; } ... int r = do_op(x,y,add); </pre> </blockquote> To make this work with SWIG, you will need to do a little extra work. Specifically, you need to create some function pointer objects using the %constant directive like this: <blockquote> <pre> %constant(int (*)(int,int)) ADD = add; </pre> </blockquote> Now, in a script, you would do this: <blockquote> <pre> set r [do_op $x $y $ADD] </pre> </blockquote> <h2>An Example</h2> Here are some files that illustrate this with a simple example: <ul> <li><a href="example.c">example.c</a> <li><a href="example.h">example.h</a> <li><a href="example.i">example.i</a> (SWIG interface) <li><a href="example.tcl">example.tcl</a> (Sample script) </ul> <h2>Notes</h2> <ul> <li>The value of a function pointer must correspond to a function written in C or C++. It is not possible to pass an arbitrary Tcl function object in as a substitute for a C function pointer. <p> <li>A Tcl function can be used as a C/C++ callback if you write some clever typemaps and are very careful about how you create your extension. This is an advanced topic not covered here. </ul> <hr> </body> </html>