Ok, that is why i have suspected. Thanks for the clear explanation.
[]s Cassiano 2014-04-09 18:37 GMT-03:00 Peter Langfelder <peter.langfel...@gmail.com>: > On Wed, Apr 9, 2014 at 11:27 AM, Cassiano dos Santos <crn...@gmail.com> > wrote: > > I am testing a call to a C function from R, using .C interface. The test > > consists in passing a numeric vector to the C function with no entries, > > dynamically allocates n positions, makes attributions and return the > vector > > to R. > > When execution enters your C function, the pointer x points to the > content (numerical values) of the R object known as 'x' to R code. > However, the content has length 0 and the value of the pointer may be > undefined (not sure about how R handles empty vectors). > > You then change the C pointer x to point to the memory you allocated. > This memory has no relation to the R object 'x', so any changes you > make cannot be reflected in the R object x. > > Further, when execution exits your function, the pointer to your > allocated memory is lost and your memory is not de-allocated (that is, > returned to the system). You should call the Free function on exit > from your function. > > So the answer is that you cannot use the .C interface for this. You > could achieve your goal via the .Call interface but you have to read > up about how to work with R objects in C code. > > HTH, > > Peter > > > > > I'm using Calloc from R.h. The prototype of the function is > > > > type* Calloc(size_t n, type) > > > > as noted in Writing R Extensions. > > > > The problem is that I don't get the new vector with the allocated > positions > > in R. The vector continues to have no entries. > > > > *The code in R* > > > > fooR <- function(x) { > > if (!is.numeric(x)) > > stop("argument x must be numeric") > > out <- .C("foo", > > x=as.double(x)) > > return(out$x)} > > > > x <- numeric() > > > > result <- myfooR(x) > > > > *The function in C* > > > > #include <R.h> > > void myfooRealloc(double *x){ > > int i, n; > > > > n = 4; > > x = Calloc(n, double); > > > > for (i = 0; i < n; i++) { > > x[i] = i; > > printf("%f\n", x[i]); //just to check > > }} > > > > The question is: Can .C inteface handle with such memory allocation? > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help@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. > [[alternative HTML version deleted]] ______________________________________________ R-help@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.