Skip to content

Commit 6afa7bf

Browse files
committed
Fix example for changes to function pointer interface
1 parent 2f46e9d commit 6afa7bf

File tree

4 files changed

+28
-33
lines changed

4 files changed

+28
-33
lines changed

Examples/fortran/funcptr/example.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
/* File : example.c */
22

3-
int do_op(int a, int b, int (*op)(int,int)) {
4-
return (*op)(a,b);
3+
int do_op(int a, int b, int (*op)(int, int)) {
4+
return (*op)(a, b);
55
}
66

77
int add(int a, int b) {
8-
return a+b;
8+
return a + b;
99
}
1010

1111
int sub(int a, int b) {
12-
return a-b;
12+
return a - b;
1313
}
1414

1515
int mul(int a, int b) {
16-
return a*b;
16+
return a * b;
1717
}
1818

19-
int (*funcvar)(int,int) = add;
19+
int (*funcvar)(int, int) = add;

Examples/fortran/funcptr/example.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
/* file: example.h */
22

3-
extern int do_op(int,int, int (*op)(int,int));
4-
extern int add(int,int);
5-
extern int sub(int,int);
6-
extern int mul(int,int);
3+
typedef int (*binary_func)(int, int);
74

8-
extern int (*funcvar)(int,int);
5+
extern int do_op(int, int, binary_func);
6+
extern int add(int, int);
7+
extern int sub(int, int);
8+
extern int mul(int, int);
9+
10+
extern int (*funcvar)(int, int);
911

Examples/fortran/funcptr/example.i

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@
44
#include "example.h"
55
%}
66

7+
%fortrancallback("%s") binary_op;
8+
int binary_op(int a, int b);
9+
10+
/* Function pointer: f(int, int) -> int */
11+
typedef int (*binary_func)(int, int);
12+
713
/* Wrap a function taking a pointer to a function */
8-
extern int do_op(int a, int b, int (*op)(int, int));
14+
extern int do_op(int a, int b, binary_func op);
915

1016
/* Now install a bunch of "ops" as constants */
1117
%constant int (*ADD)(int,int) = add;

Examples/fortran/funcptr/runme.f90

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,6 @@ module fortran_ops
44
implicit none
55
public
66

7-
abstract interface
8-
! Interface corresponding to the C typedef "BinaryOp"
9-
function binary_op(aa, bb) bind(C) result(cc)
10-
use, intrinsic :: ISO_C_BINDING
11-
integer(C_INT), intent(in), value :: aa
12-
integer(C_INT), intent(in), value :: bb
13-
integer(C_INT) :: cc
14-
end function
15-
end interface
16-
177
contains
188
! Fortran function that we can export so that
199
! it's available to C code
@@ -39,19 +29,16 @@ program fortran_funptr_runme
3929
integer, parameter :: STDOUT = OUTPUT_UNIT
4030
integer(C_INT) :: a = 4
4131
integer(C_INT) :: b = 3
42-
type(C_FUNPTR) :: temp_funptr
43-
procedure(binary_op), pointer :: my_ffunc => null()
32+
procedure(binary_op), pointer :: fptr => null()
4433

45-
write(STDOUT,*) "SWIG-wrapped C function pointer:", do_op(a,b,add)
46-
write(STDOUT,*) "SWIG-wrapped C function pointer:", do_op(a,b,sub)
47-
write(STDOUT,*) "SWIG-wrapped C function pointer:", do_op(a,b,mul)
34+
call c_f_procpointer(add, fptr)
35+
write(STDOUT,*) "SWIG-wrapped C function pointer:", do_op(a, b, fptr)
36+
call c_f_procpointer(sub, fptr)
37+
write(STDOUT,*) "SWIG-wrapped C function pointer:", do_op(a, b, fptr)
38+
call c_f_procpointer(mul, fptr)
39+
write(STDOUT,*) "SWIG-wrapped C function pointer:", do_op(a, b, fptr)
4840

4941
! Convert Fortran function to C function pointer
50-
temp_funptr = c_funloc(fortran_mul)
51-
write(STDOUT,*) "C call to Fortran function:", do_op(a,b,temp_funptr)
52-
53-
! Convert C function pointer to a Fortran function pointer
54-
call c_f_procpointer(add, my_ffunc)
55-
write(STDOUT,*) "Fortran direct call to C function:", my_ffunc(a,b)
42+
write(STDOUT,*) "C call to Fortran function:", do_op(a, b, fortran_mul)
5643

5744
end program

0 commit comments

Comments
 (0)