You can legally cast a function pointer to another function pointer, where the signatures differ. (It is not legal to cast between data and function pointers.) I would make typedefs for the various signatures, as the casting syntax is more readable then.
Bill Dunlap TIBCO Software wdunlap tibco.com On Fri, Dec 29, 2017 at 10:13 AM, Therneau, Terry M., Ph.D. < thern...@mayo.edu> wrote: > Bill, > That's a very nice solution. It is both cleaner looking and preferable > to track R's .h files. > However, some of my routines don't have void * as the return type (two are > int *), and Rdynload has > > typedef void * (*DL_FUNC)(); > > Will this untruth mess anything up? > > Terry T. > > On 12/29/2017 10:52 AM, William Dunlap wrote: > > And remove the cast on the return value of R_GETCCallable. And check > that your function is found before using it. > > #include <R.h> > #include <Rinternals.h> > #include <R_ext/Rdynload.h> > > void bdsmatrix_prod4(int nrow, int nblock, int *bsize, > double *bmat, double *rmat, > int nfrail, double *y) { > DL_FUNC fun = NULL; > if (fun==NULL) { > fun = R_GetCCallable("bdsmatrix", "bdsmatrix_prod4"); > } > if (fun==NULL) { > Rf_error("Cannot find C function 'bdsmatrix_prod4' in library > 'bdsmatrix.{so,dll}'"); > } > fun(nrow, nblock, bsize, bmat, rmat, nfrail, y); > } > > > > > Bill Dunlap > TIBCO Software > wdunlap tibco.com > > On Fri, Dec 29, 2017 at 8:48 AM, William Dunlap <wdun...@tibco.com> wrote: > >> Try changing >> static void (*fun)() = NULL; >> to >> DL_FUNC fun = NULL; >> >> Bill Dunlap >> TIBCO Software >> wdunlap tibco.com >> >> On Fri, Dec 29, 2017 at 5:14 AM, Therneau, Terry M., Ph.D. < >> thern...@mayo.edu> wrote: >> >>> I've recently updated the coxme package, which calls internal routines >>> from the bdsmatrix package. (It is in fact mentioned as an example of this >>> in the Extensions manual.) >>> The call connections are a blocks like this, one for each of the 9 >>> called C routines. >>> >>> void bdsmatrix_prod4(int nrow, int nblock, int *bsize, >>> double *bmat, double *rmat, >>> int nfrail, double *y) { >>> static void (*fun)() = NULL; >>> if (fun==NULL) >>> fun = (void (*)) R_GetCCallable("bdsmatrix", "bdsmatrix_prod4"); >>> fun(nrow, nblock, bsize, bmat, rmat, nfrail, y); >>> } >>> >>> .. >>> >>> The winbuilder run is flagging all of these with >>> >>> bdsmatrix_stub.h:22:6: warning: ISO C forbids assignment between >>> function pointer and 'void *' [-Wpedantic] >>> fun = (void (*)) R_GetCCallable("bdsmatrix", "bdsmatrix_prod4"); >>> >>> Ignore? Or should these lines have been written in a different way? >>> >>> Terry T. >>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >> >> >> > > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel