From karl.forner at gmail.com  Fri Feb  1 10:25:09 2013
From: karl.forner at gmail.com (Karl Forner)
Date: Fri, 1 Feb 2013 10:25:09 +0100
Subject: [Rd] Problem using raw vectors with inline cfunction
Message-ID: <CAMd4_AeG-shk9q6vsf3C9KP=VnfAdu77D4j=W-qE9vmjJJLcYA@mail.gmail.com>

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



[Rd] Problem using raw vectors with inline cfunction
Karl Forner