winbuilder warning message wrt function pointers

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

winbuilder warning message wrt function pointers

Therneau, Terry M., Ph.D.
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.

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: winbuilder warning message wrt function pointers

R devel mailing list
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. <
[hidden email]> 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.
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: winbuilder warning message wrt function pointers

R devel mailing list
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 <[hidden email]> 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. <
> [hidden email]> 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.
>>
>> ______________________________________________
>> [hidden email] mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
>

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: winbuilder warning message wrt function pointers

Therneau, Terry M., Ph.D.
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 <http://tibco.com>
>
> On Fri, Dec 29, 2017 at 8:48 AM, William Dunlap <[hidden email]
> <mailto:[hidden email]>> wrote:
>
>     Try changing
>       static void (*fun)() = NULL;
>     to
>       DL_FUNC fun = NULL;
>
>     Bill Dunlap
>     TIBCO Software
>     wdunlap tibco.com <http://tibco.com>
>
>     On Fri, Dec 29, 2017 at 5:14 AM, Therneau, Terry M., Ph.D. <[hidden email]
>     <mailto:[hidden email]>> 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.
>
>         ______________________________________________
>         [hidden email] <mailto:[hidden email]> mailing list
>         https://stat.ethz.ch/mailman/listinfo/r-devel
>         <https://stat.ethz.ch/mailman/listinfo/r-devel>
>
>
>


        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: winbuilder warning message wrt function pointers

R devel mailing list
In reply to this post by R devel mailing list
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. <
[hidden email]> 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 <[hidden email]> 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. <
>> [hidden email]> 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.
>>>
>>> ______________________________________________
>>> [hidden email] mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>>
>>
>
>

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel