diff options
Diffstat (limited to 'Examples/octave/pointer')
| -rw-r--r-- | Examples/octave/pointer/Makefile | 19 | ||||
| -rw-r--r-- | Examples/octave/pointer/example.c | 16 | ||||
| -rw-r--r-- | Examples/octave/pointer/example.i | 30 | ||||
| -rw-r--r-- | Examples/octave/pointer/runme.m | 42 |
4 files changed, 107 insertions, 0 deletions
diff --git a/Examples/octave/pointer/Makefile b/Examples/octave/pointer/Makefile new file mode 100644 index 0000000..627b0a9 --- /dev/null +++ b/Examples/octave/pointer/Makefile @@ -0,0 +1,19 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +SRCS = example.c +TARGET = example +INTERFACE = example.i + +all:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' octave + +static:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + TARGET='myoctave' INTERFACE='$(INTERFACE)' octave_static + +clean:: + $(MAKE) -f $(TOP)/Makefile octave_clean + rm -f $(TARGET).py + +check: all diff --git a/Examples/octave/pointer/example.c b/Examples/octave/pointer/example.c new file mode 100644 index 0000000..b877d9a --- /dev/null +++ b/Examples/octave/pointer/example.c @@ -0,0 +1,16 @@ +/* File : example.c */ + +void add(int *x, int *y, int *result) { + *result = *x + *y; +} + +void sub(int *x, int *y, int *result) { + *result = *x - *y; +} + +int divide(int n, int d, int *r) { + int q; + q = n/d; + *r = n - q*d; + return q; +} diff --git a/Examples/octave/pointer/example.i b/Examples/octave/pointer/example.i new file mode 100644 index 0000000..a8ac794 --- /dev/null +++ b/Examples/octave/pointer/example.i @@ -0,0 +1,30 @@ +/* File : example.i */ +%module example + +%{ +extern void add(int *, int *, int *); +extern void sub(int *, int *, int *); +extern int divide(int, int, int *); +%} + +/* This example illustrates a couple of different techniques + for manipulating C pointers */ + +/* First we'll use the pointer library */ +extern void add(int *x, int *y, int *result); +%include cpointer.i +%pointer_functions(int, intp); + +/* Next we'll use some typemaps */ + +%include typemaps.i +extern void sub(int *INPUT, int *INPUT, int *OUTPUT); + +/* Next we'll use typemaps and the %apply directive */ + +%apply int *OUTPUT { int *r }; +extern int divide(int n, int d, int *r); + + + + diff --git a/Examples/octave/pointer/runme.m b/Examples/octave/pointer/runme.m new file mode 100644 index 0000000..c36df72 --- /dev/null +++ b/Examples/octave/pointer/runme.m @@ -0,0 +1,42 @@ +# file: runme.m + +example; + +# First create some objects using the pointer library. +printf("Testing the pointer library\n"); +a = example.new_intp(); +b = example.new_intp(); +c = example.new_intp(); +example.intp_assign(a,37); +example.intp_assign(b,42); + +a,b,c + +# Call the add() function with some pointers +example.add(a,b,c); + +# Now get the result +r = example.intp_value(c); +printf(" 37 + 42 = %i\n",r); + +# Clean up the pointers +example.delete_intp(a); +example.delete_intp(b); +example.delete_intp(c); + +# Now try the typemap library +# This should be much easier. Now how it is no longer +# necessary to manufacture pointers. + +printf("Trying the typemap library\n"); +r = example.sub(37,42); +printf(" 37 - 42 = %i\n",r); + +# Now try the version with multiple return values + +printf("Testing multiple return values\n"); +[q,r] = example.divide(42,37); +printf(" 42/37 = %d remainder %d\n",q,r); + + + |
