Re: [Rd] Issue with c++ .C call

From: Sean Davis <sdavis2_at_mail.nih.gov>
Date: Tue 10 Jan 2006 - 19:18:18 GMT

On 1/10/06 1:41 PM, "Dominick Samperi" <dsamperi@DecisionSynergy.com> wrote:

> Sean,
>
> prm in your function calcStepgram is NOT a vector of doubles, it is of type
> SEXP, and you need to use R macros to fetch the value(s). This is done
> automatically in the Rcpp package, and if you want to see how this is
> done look at the definition of the class RcppVector in Rcpp.cpp

I'm not sure why the prm parameter is not a vector; I thought this was the standard way to create a vector of doubles.... So to confuse myself even more, I have added a simple C function that looks simply calls my C++ function like this:

extern "C" {
  void mymain(double *data,double *prm, double* intervals, int* max, int *n, double *plot) {

    calcStepgram(data,prm,intervals,max,n,plot);   }
}

Then, I call this function using .C('mymain',...) as before. Note the change in parameter memory locations from the call to mymain and the call to calcStepgram. Why does this happen?

> dyn.load('StepGram/src/Stepgram.so')
> mySG <- function(dat1,thresh,noise) {
  vec <- c(thresh,noise)
  .C('mymain',

     data=as.double(dat1),
     prm=as.double(vec),
     intervals=double(10000*3+1),
     max=as.integer(10000),
     n=as.integer(length(dat1)),
     plot=double(length(dat1)))}

> dat <- c(0.01,0.1,-0.2,0.1,-0.1,-1000,3.2,3.5,-1.3,
3.1,3.2,3.1,-0.1,0.2,0.15,-0.05,-0.1,0.2,0.1,-0.1)

....

(gdb) break mymain
Breakpoint 1 at 0x10c13f0: file Stepgram.cpp, line 23. (gdb) c
Continuing.
> mySG(dat1=dat,thresh=3,noise=1)

Breakpoint 1, mymain (data=0x1137148, prm=0x195cd30, intervals=0x1386018, max=0x1b208e0, n=0x1b20900, plot=0x1137208) at Stepgram.cpp:23 23 calcStepgram(data,prm,intervals,max,n,plot); (gdb) print prm[0]
$1 = 3
Current language: auto; currently c++
(gdb) print prm[1]
$2 = 1
(gdb) print max[0]
$3 = 10000
(gdb) s
calcStepgram (data=0x1137148, prm=0x180da24, intervals=0x195cd68, max=0x1999d6c, n=0xbfffd6e0, plot=0x0) at Stepgram.cpp:29 29 Stepgram* sg=new Stepgram(data, *n); (gdb) print prm[0]
$4 = 2.0002441518028817
(gdb)



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed Jan 11 06:23:32 2006

This archive was generated by hypermail 2.1.8 : Wed 11 Jan 2006 - 04:05:47 GMT