[Rd] winbuilder warning message wrt function pointers
William Dunlap
wdunlap at tibco.com
Fri Dec 29 19:19:51 CET 2017
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. <
therneau at 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 <wdunlap at 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. <
>> therneau at 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 at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>>
>>
>
>
[[alternative HTML version deleted]]
More information about the R-devel
mailing list