[R] fortran package crashes

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon Jun 23 11:35:40 CEST 2014


On 23/06/2014 10:06, Karl May wrote:
> Hi all,
>
> I have written a small Fortran routine to be attached to R for private use,
> that is reading matrices written to binary files by a Fortran program (I could
> not get "readBin" to read it). Unfortunately, when using the package R crashes
> every now and then, but not always, with a segmentation fault. When restarting
> R, it very often happens that the same read command, parameterised as before,
> is successful. Since the routine compiles without errors when installing it
> into R, I have no idea where to search further for the bug and it would be
> great if you could have a look at the source code below.

See the 'Writing R Extensions' manual, 
http://cran.r-project.org/doc/manuals/r-patched/R-exts.html#Debugging

Such things are usually caused by either array overruns or use of 
uninitialized memory.


>
> Thank you very much.
>
>
> readfortran <- function(filename,nrows,ncols){
>      dat <- matrix(0,ncol=ncols,nrow=nrows)
>      ISStat <- c()
>      out <- .Fortran("readfortran",
>                      csfilename=as.character(filename),
>                      ISNCol=as.integer(ncols),
>                      ISNRow=as.integer(nrows),
>                      RMOut=dat,
>                      ISStat=as.integer(ISStat),
>                      Package="readfortran")
>      return(out)
> }
>
> Subroutine readfortran(csfilename,ISNcol,ISNrow,RMOut,ISStat)
>    Implicit None
>    Integer, Parameter :: IkXL=Selected_Int_Kind(12)
>    Integer, Parameter :: IkS=Selected_Int_Kind(2)
>    Integer(IkS), Parameter :: RkDbl=Selected_Real_Kind(15,100)
>    Character(len=100), intent(inout) :: CSFileName
>    Integer(IKXL), intent(inout) ::ISNCol, ISNrow
>    Real(rkdbl), Intent(inout), Dimension(ISNRow,ISNCol) :: RMOut
>    Character(len=400) :: CSErr
>    Integer(ikXL), intent(inout) :: ISStat
>    Integer(IkXL) :: c1, c2
>    open(unit=200,file=Trim(AdjustL(CSFilename)),status="old",action="&
>     &read",form="unformatted",iostat=isstat,iomsg=cserr)
>    If(ISSTat==0) Then
>      Do c1=1,ISNRow
>        read(200,iostat=isstat,iomsg=Cserr) (RMOut(c1,c2),c2=1,ISNCol)
>        If(ISStat/=0) Then
>          write(*,*) "Reading error"//Trim(AdjustL(CSErr))
>          exit
>        End If
>      End Do
>    Else
>      write(*,*) "Opening error "//Trim(AdjustL(CSErr))
>    End If
>    If(ISSTat==0) Then
>      write(*,*) "Reading successfull"
>    End If
>    close(unit=200,status="keep")
> End Subroutine readfortran
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
Please do.  This is not reproducible, you have not told us your platform 
and this is the wrong list ....

-- 
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



More information about the R-help mailing list