[Rd] LOGICAL arguments in FORTRAN code
William Dunlap
wdunlap at tibco.com
Thu Apr 8 18:01:18 CEST 2010
> -----Original Message-----
> From: r-devel-bounces at r-project.org
> [mailto:r-devel-bounces at r-project.org] On Behalf Of Prof Brian Ripley
> Sent: Thursday, April 08, 2010 4:41 AM
> To: Berwin A Turlach
> Cc: r-devel
> Subject: Re: [Rd] LOGICAL arguments in FORTRAN code
>
> On Thu, 8 Apr 2010, Berwin A Turlach wrote:
>
> > G'day all,
> >
> > I just took over maintenance of the quadprog package from
> Kurt Hornik
> > and noticed that one of the FORTRAN routines has an argument that is
> > declared to be a LOGICAL. The R code that calls this routine (via
> > the .Fortran interface) passes the argument down wrapped in
> a call to
> > as.logical().
> >
> > This was fine (and as documented) under S-Plus 3.4, for
> which this code
> > was originally developed. However, as far as I know, in R
> objects of
> > storage mode logical were always supposed to be passed to FORTRAN
> > arguments of type INTEGER; and that is what the current "Writing R
> > extension manual states".
> >
> > Thus, given that the port of quadprog existed for quite some time, I
> > am wondering whether it is o.k. to pass R objects with storage mode
> > logical into FORTRAN code to arguments declared as LOGICAL?
> Or should
> > the FORTRAN code be corrected to declare the argument in question as
> > INTEGER?
>
> The second to be safe. This is not a question on the S-PLUS/R side
> but on the Fortran side. A Fortran compiler may or may not use the
> same storage for integer and logical (and it may depend on compiler
> flags, although not on the compilers I just checked, gfortran and
> SunStudio f95). S-PLUS ran on only a few platforms and with
> specified
> compilers.
I agree that avoiding LOGICAL's in arguments to Fortran
subroutines is a good idea. Fortran compilers are prone
to do weird things when encoding LOGICAL values. E.g.,
I vaguely recall that Apollo's compiler (c. 1990) encoded
.true. as 0 (all zeros) and .false. as -1 (all 1's) and
HP's compiler of the same era looked only at the 8th bit
from the left (no matter if you had a 1, 2, or 4 byte LOGICAL),
0 was .false. and 1 was .true. S+'s .Fortran() took care of
these but you couldn't safely call Fortran code with such arguments
from C. Avoid character arguments for similar reasons.
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
>
> >
> > Cheers,
> >
> > Berwin
> >
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
>
> --
> Brian D. Ripley, ripley at stats.ox.ac.uk
> Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
> University of Oxford, Tel: +44 1865 272861 (self)
> 1 South Parks Road, +44 1865 272866 (PA)
> Oxford OX1 3TG, UK Fax: +44 1865 272595
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
More information about the R-devel
mailing list