#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" static SV * userfunc; double userfunc_wrapper(double *x) { int n; double r; dSP; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(newSVnv(*x))); PUTBACK; n = call_sv(userfunc, G_SCALAR); SPAGAIN; if (n != 1) croak("wrong number of args returned!\n"); r = POPn; PUTBACK; FREETMPS; LEAVE; return r; } // the Fortran function double myfunc_(double *x, double *y, void* func); double myfunc(double x, double y) { double r; r = myfunc_(&x, &y, &userfunc_wrapper); return r; } MODULE = P2f2p PACKAGE = P2f2p double myfunc(x, y, ufunc) double x double y SV * ufunc CODE: userfunc = newSVsv(ufunc); RETVAL = myfunc(x, y); OUTPUT: RETVAL