Hello,
That is a bug in inline indeed. I just commited a fix in r-forge.
The fix is to obviously replace this as.character by an as.raw.
Thanks for teh report.
Romain
Le 01/02/13 10:25, Karl Forner a écrit :
Hello,
From what I understood from the documentation I found, when using the
inline cfunction with convention=".C",
R raw vectors should be given as unsigned char* to the C function.
But consider the following script:
library(inline)
testRaw <- cfunction(signature(raw='raw', len='integer')
, body='
int l = *len;
int i = 0;
Rprintf("sizeof(raw[0])=%i\\n", sizeof(raw[0]));
for (i = 0; i < l; ++i) Rprintf("%i, ", (int)raw[i]);
for (i = 0; i < l; ++i) raw[i] = i*10;
'
, convention=".C", language='C', verbose=TRUE
)
tt <- as.raw(1:10)
testRaw(tt, length(tt))
When I execute it:
$ R --vanilla --quiet < work/inline_cfunction_raw_bug.R
sizeof(raw[0])=1
192, 216, 223, 0, 0, 0, 0, 0, 224, 214,
*** caught segfault ***
address (nil), cause 'unknown'
Traceback:
1: .Primitive(".C")(<pointer: 0x7eff8bd605c0>, raw =
as.character(raw), len = as.integer(len))
2: testRaw(tt, length(tt))
aborting ...
Segmentation fault (core dumped)
I was expecting to get in the C function a pointer on a byte array of
values (1,2,3,4,5,6,7,8,9,10).
Apparently that is not the case. I guess that the "raw =
as.character(raw)," printed in the traceback is responsible for the
observed behavior.
If it is expected behavior, how can I get a pointer on my array of bytes ?
Thanks.
Karl
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
R Graph Gallery: http://gallery.r-enthusiasts.com
blog: http://romainfrancois.blog.free.fr
|- http://bit.ly/RE6sYH : OOP with Rcpp modules
`- http://bit.ly/Thw7IK : Rcpp modules more flexible
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel