[R] correct C function usage

Ido M. Tamir tamir at imp.univie.ac.at
Wed Dec 14 10:37:07 CET 2005


On Tuesday 13 December 2005 22:35, you wrote:
> On Tue, 13 Dec 2005, Ido M. Tamir wrote:
> > Hello,
> > I am not sure if I am interfacing with C correctly and _safely_
> > or if there is a better way esp. with regards to terminating
> > the "returned" array.
>
> You need to pass the length to the C routine and check you do not
> overwrite it.  (As in the parts you -snip-ed below.)

> > testFillC <- function(a){
> >  .C("testFill", as.integer(a), newvalues=integer(length(a)),
> > endposition=integer(1))
> > }
>
> What do testFillC(1) or testFillC(logical(0)) do?
Thats undefined - probably a segmentation fault. 

Thank you very much for your answers.

I was trying to cut down my actual function so readers could focus
on what I was seeing as the main problem: terminating the array.
I was hoping that somebody would tell me that I only have to terminate
the array in the C function somehow and the R part would recognize
that automagically - and no more passing lengths explicitly around and 
copying arrays up to  length - e.g (ignoring wrong arguments):

void testFill(int *values, int *newvalues ){
         newvalues[0] = 1;
         newvalues[1] = 2;
         newvalues[2] =  '\0';
 }

testTestFill <- function(){
  realfilled <- testFillC( 1:10 ) 
  return(realfilled)
 }

testFillC <- function(a){
 .C("testFill", as.integer(a), newvalues=integer(length(a)))$newvalues
 }

But I tried this and it does not help.

sincerely, 
Ido Tamir




More information about the R-help mailing list