Skip to content

returning vectors of unknown size from C (with .C)

6 messages · Duncan Murdoch, Ramon Diaz-Uriarte, Brian Ripley +1 more

#
Dear All,

In a package, I am using ".C" to call some C functions. In one case,
the number of elements of the return vectors are not known in R before
the C call. (Two of the vectors are integers, the third is vector of
character strings).

Passing from R a vector of the maximum possible size would be a huge
waste. I understand one alternative is to use ".Call", but I'd rather
avoid it if I can (all of the code seems working except for the return
of values into R). Another would be to write to a file from C and then
read that into R, but this looks very ugly. Are there any other
reasonable alternatives, or should I just use .Call?

Thanks,

R.
#
Ramon Diaz-Uriarte wrote:
.Call is usually easiest, but another possibility is to have two entry 
points:  one to calculate how much space you need, a second to pass in a 
vector that's the right size to hold the result.

Duncan Murdoch
#
On Sat, Apr 26, 2008 at 3:19 AM, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
You mean making two successive calls to the C code? The problem is
that the size of the result is not known until the result is obtained
(in my C code, the underlying structure is a linked list that gets
stretched as needed as the computation proceeds). So I would not know
"where to leave the result from C" in between the two calls to C.

Best,

R.

  
    
#
On Sat, 26 Apr 2008, Ramon Diaz-Uriarte wrote:

            
But that is possible (you malloc the memory for a local copy in the rist 
call), and rpart does something like it.
#
On Sat, Apr 26, 2008 at 11:38 AM, Prof Brian Ripley
<ripley at stats.ox.ac.uk> wrote:
Aha, thanks, I didn't know it was doable (or easy). I'll look at the
rpart code. One further question, though, what is "the rist call"?

Thanks,

R.

  
    
#
Hola Ramon!
I think Brian meant to type "first call".

Thanks!!

Dave H