correct C function usage
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.)
I am trying to fill an int array with values whose actual size
is determined in the C function and is always maximally as large
as length(values).
I also don't understand the purpose of $ab in the example:
conv <- function(a, b)
.C("convolve",
-snip-
ab = double(length(a) + length(b) - 1))$ab
.C returns a list, an element for each argument after the first, named if the arguments were named. So this selects the (copy) of the vector sent back as the last argument of the C function.
void testFill(int *values, int *newvalues, int* endposition ){
newvalues[0] = 1;
newvalues[1] = 2;
*endposition = 2;
}
dyn.load("../testFill.so")
testTestFill <- function(){
tempfilled <- testFillC( c(30:40))
realfilled <- tempfilled$newvalues[1:tempfilled$endposition]
return(realfilled)
}
testFillC <- function(a){
.C("testFill", as.integer(a), newvalues=integer(length(a)),
endposition=integer(1))
}
What do testFillC(1) or testFillC(logical(0)) do?
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