[R-pkg-devel] R_registerRoutines, etc.
Rolf Turner
r.turner at auckland.ac.nz
Mon Apr 24 03:35:37 CEST 2017
On 24/04/17 12:39, Duncan Murdoch wrote:
> On 23/04/2017 7:53 PM, Rolf Turner wrote:
>> On 24/04/17 11:36, Duncan Murdoch wrote:
>>> On 23/04/2017 6:18 PM, Rolf Turner wrote:
>>>> On 23/04/17 23:05, Duncan Murdoch wrote:
>>>>
>>>>>>>
>>>>>>> Looks like
>>>>>>>
>>>>>>> extern void F77_NAME(mnnd)(double *, double *, int *, double *,
>>>>>>> double *);
>>>>>>>
>>>>>>> to me.
>>>>
>>>> One more (I hope it's the last!) question:
>>>>
>>>> One of my subroutines has an argument of type *logical*. There is no
>>>> logical type in C. So, since I am perforce using C-speak, I cannot
>>>> change "void *" to "void logical".
>>>>
>>>
>>> For questions like this, see Writing R Extensions section 5.2. "Logical"
>>> in R is "int *" in C, and "INTEGER" in Fortran.
>>>
>>> This is important: *there is no way to pass a Fortran "LOGICAL" from R
>>> to Fortran*.
>>>
>>> The issue is that different Fortran compilers store LOGICAL in different
>>> ways. Some are equivalent to int with 0 for FALSE, all else for TRUE,
>>> but not all are. So don't rely on it.
>>>
>>> If you need to call a Fortran subroutine that takes a LOGICAL argument,
>>> you need to write another Fortran subroutine that takes an INTEGER
>>> argument. Then compute "arg NE 0" (or whatever the Fortran version is
>>> for testing not equal to zero) and pass that to the original routine.
>>
>> Hoo-boy!!! Some serious code-rewriting called for!
>>
>> Thanks for setting me straight on this.
>>
>> Is it possible that R CMD check could be set up to issue an error, or at
>> least a warning, if it finds "logical" or "as.logical" in the argument
>> lists of calls to .Fortran()?
>>
>
> The problem is at the other end. Passing an R logical is fine; it just
> turns into an INTEGER on its way to Fortran.
Yes, but surely this is an indication that the Fortran code being called
"expects" a logical and thereby might screw up if its way of
converting integers to logicals were problematic.
> I doubt if it is feasible to detect the problem in Fortran, but static
> analysis keeps getting better, so I could be wrong now or in a while.
If it is, or should become, feasible, it seems to me that it should be
done. OTOH I gather from other posts that the .Fortran() interface
will eventually be removed, so the problem (in this form) will go away.
The *real* problem will then be to write C wrappers for all our Fortran
routines that are (directly) called by R functions. And this is a task
that is impossible for people like me who go catatonic when they see C
code. So at that point I will just give up and go to the pub.
<SNIP>
cheers,
Rolf
--
Technical Editor ANZJS
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276
More information about the R-package-devel
mailing list