incomplete and possibly out of date example removed
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6583 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
76a10934d8
commit
e08fb23b8a
6 changed files with 0 additions and 210 deletions
|
|
@ -1,13 +0,0 @@
|
||||||
example.py
|
|
||||||
example.pyc
|
|
||||||
*_wrap.c
|
|
||||||
*_wrap.cxx
|
|
||||||
*.dll
|
|
||||||
*.dsw
|
|
||||||
*.exp
|
|
||||||
*.lib
|
|
||||||
*.ncb
|
|
||||||
*.opt
|
|
||||||
*.plg
|
|
||||||
Release
|
|
||||||
Debug
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
TOP = ../..
|
|
||||||
SWIG = $(TOP)/../swig
|
|
||||||
SRCS = example.c
|
|
||||||
TARGET = example
|
|
||||||
INTERFACE = example.i
|
|
||||||
|
|
||||||
all::
|
|
||||||
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
|
||||||
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' python
|
|
||||||
|
|
||||||
static::
|
|
||||||
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
|
||||||
TARGET='mypython' INTERFACE='$(INTERFACE)' python_static
|
|
||||||
|
|
||||||
clean::
|
|
||||||
$(MAKE) -f $(TOP)/Makefile python_clean
|
|
||||||
rm -f $(TARGET).py
|
|
||||||
|
|
||||||
check: all
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
/* File : example.c */
|
|
||||||
|
|
||||||
#include "example.h"
|
|
||||||
|
|
||||||
double dot_product(Vector a, Vector b) {
|
|
||||||
return (a.x*b.x + a.y*b.y + a.z*b.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector vector_add(Vector a, Vector b) {
|
|
||||||
Vector r;
|
|
||||||
r.x = a.x + b.x;
|
|
||||||
r.y = a.y + b.y;
|
|
||||||
r.z = a.z + b.z;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
/* File : example.h */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
double x, y, z;
|
|
||||||
} Vector;
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
// Tests SWIG's handling of pass-by-value for complex datatypes
|
|
||||||
%module example
|
|
||||||
|
|
||||||
%{
|
|
||||||
#include "example.h"
|
|
||||||
%}
|
|
||||||
|
|
||||||
/* Some functions that manipulate Vectors by value */
|
|
||||||
extern double dot_product(Vector a, Vector b);
|
|
||||||
extern Vector vector_add(Vector a, Vector b);
|
|
||||||
|
|
||||||
/* Include this because the vector_add() function will leak memory */
|
|
||||||
void free(void *);
|
|
||||||
|
|
||||||
/* Some helper functions for our interface */
|
|
||||||
%inline %{
|
|
||||||
|
|
||||||
Vector *new_Vector(double x, double y, double z) {
|
|
||||||
Vector *v = (Vector *) malloc(sizeof(Vector));
|
|
||||||
v->x = x;
|
|
||||||
v->y = y;
|
|
||||||
v->z = z;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
void vector_print(Vector *v) {
|
|
||||||
printf("Vector %x = (%g, %g, %g)\n", v, v->x, v->y, v->z);
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>SWIG:Examples:python:value</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body bgcolor="#ffffff">
|
|
||||||
|
|
||||||
|
|
||||||
<tt>SWIG/Examples/python/value/</tt>
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<H2>Passing and Returning Structures by Value</H2>
|
|
||||||
|
|
||||||
<tt>$Header$</tt><br>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Occasionally, a C program will manipulate structures by value such as shown in the
|
|
||||||
following code:
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
/* File : example.c */
|
|
||||||
|
|
||||||
typedef struct Vector {
|
|
||||||
double x, y, z;
|
|
||||||
} Vector;
|
|
||||||
|
|
||||||
double dot_product(Vector a, Vector b) {
|
|
||||||
return (a.x*b.x + a.y*b.y + a.z*b.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector vector_add(Vector a, Vector b) {
|
|
||||||
Vector r;
|
|
||||||
r.x = a.x + b.x;
|
|
||||||
r.y = a.y + b.y;
|
|
||||||
r.z = a.z + b.z;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
Since SWIG only knows how to manage pointers to structures (not their internal
|
|
||||||
representation), the following translations are made when wrappers are
|
|
||||||
created:
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
double wrap_dot_product(Vector *a, Vector *b) {
|
|
||||||
return dot_product(*a,*b);
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector *wrap_vector_add(Vector *a, Vector *b) {
|
|
||||||
Vector *r = (Vector *) malloc(sizeof(Vector));
|
|
||||||
*r = vector_add(*a,*b);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
The functions are then called using pointers from the scripting language interface.
|
|
||||||
It should also be noted that any function that returns a structure by value results
|
|
||||||
in an implicit memory allocation. This will be a memory leak unless you take steps
|
|
||||||
to free the result (see below).
|
|
||||||
|
|
||||||
<h2>The SWIG interface</h2>
|
|
||||||
|
|
||||||
Click <a href="example.i">here</a> to see a SWIG interface file that
|
|
||||||
wraps these two functions. In this file, there are a few essential features:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>A wrapper for the <tt>free()</tt> function is created so that we
|
|
||||||
can clean up the return result created by <tt>vector_add()</tt>
|
|
||||||
function.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<li>The %inline directive is used to create a few helper functions for creating new Vector
|
|
||||||
objects and to print out the value (for debugging purposes).
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2>A Python Script</h2>
|
|
||||||
|
|
||||||
Click <a href="example.py">here</a> to see a script that uses these functions from Python.
|
|
||||||
|
|
||||||
<h2>Notes</h2>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>When the '<tt>-c++</tt>' option is used, the resulting wrapper code for the return value
|
|
||||||
changes to the following:
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
Vector *wrap_vector_add(Vector *a, Vector *b) {
|
|
||||||
Vector *r = new Vector(vector_add(*a,*b));
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
Similarly, it would be a mistake to use the <tt>free()</tt> function from C++. A safer
|
|
||||||
approach would be to write a helper function like this:
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
%inline %{
|
|
||||||
void delete_Vector(Vector *v) {
|
|
||||||
delete v;
|
|
||||||
}
|
|
||||||
%}
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<li>If you use shadow classes and are careful, the SWIG generated wrappers can automatically
|
|
||||||
clean up the result of return-by-reference when the scripting variable goes out of scope.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<li>Passing parameters by value like this really isn't the best C programming style.
|
|
||||||
If possible, you might change your application to use pointers.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<li>Similar translations are made when C++ references are used.
|
|
||||||
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue