Saptarshi Guha
2007-Jul-10 15:41 UTC
[Rd] How to preserve data across function calls in a library package
Hi, I am writing an R package with two functions in C++. So far everything works. Now, i would like to write a third function which would use a pointer (it is a pointer to a class object) created by first function. I tried placing this pointer outside of the function definitions (i.e to make it global) but when called in the 3rd function i get> *** caught bus error ***address 0x0, cause 'invalid alignment'" I tried Callocing it in the 1st function but to no avail. Here is a quick summary. When foo is called (through do_foo, **after** having called do_kNN_e) i get the aforementioned error. Can anyone provide some pointers (no pun intended) on this? Thanks Saptarshi ANN* book; int* foot; void foo(void){ Rprintf("many times\n"); Rprintf("%p\n",book); Rprintf("%p\n",foot); } SEXP kNN_e(SEXP data, SEXP Nrow, SEXP Ncol,SEXP K,SEXP Eps) { int nrow=asInteger(Nrow); int ncol=asInteger(Ncol); int k=asInteger(K); double eps=asReal(Eps); SEXP ans,distance; SEXP retlist; PROTECT(ans=allocMatrix(INTSXP,nrow,k)); //The 2nd argument gives the number of rows, and the last the number of cols see http://cran.r- project.org/doc/manuals/R-exts.html PROTECT(distance=allocMatrix(REALSXP,nrow,k)); ANNpointArray datapoints; ANNpoint qpoint; ANNkd_tree* kdTree; book=Calloc(1,ANN*); foot=Calloc(1,int); book=kdTree; *foot=10; ....... } extern "C" { void do_foo(void){ foo(); } SEXP do_kNN_e(SEXP data, SEXP Nrow, SEXP Ncol,SEXP k,SEXP eps) { return kNN_e(data,Nrow, Ncol, k,eps); } [[alternative HTML version deleted]]
Saptarshi Guha
2007-Jul-10 16:33 UTC
[Rd] [R] How to preserve data across function calls in a library package
Hi, Some progress: I am using SEXP retty; book=Calloc(1,int); *book=10; PROTECT(retty=R_MakeExternalPtr(book,R_NilValue,R_NilValue)); then UNPROTECTING and returning retty. In a another function, foo(SEXP s){ int* f=(int *)R_ExternalPtrAddr(p); Rprintf("many times %d\n",*f); } When called do_foo(p) where do_foo calls foo and p is the pointer returned by the former code snippet, the Rprintf successfully prints the correct value but subsequently crashes *** caught bus error *** address 0x0, cause 'invalid alignment'. I can't figure out why... I would appreciate any advice provided. Rgds Saptarshi On Jul 10, 2007, at 11:41 AM, Saptarshi Guha wrote:> Hi, > I am writing an R package with two functions in C++. So far > everything works. > Now, i would like to write a third function which would use a pointer > (it is a pointer to a class object) created by first function. > I tried placing this pointer outside of the function definitions > (i.e to make it global) but when called in the 3rd function i get >> *** caught bus error *** > address 0x0, cause 'invalid alignment'" > > I tried Callocing it in the 1st function but to no avail. Here is a > quick summary. When foo is called (through do_foo, **after** having > called do_kNN_e) i get the aforementioned error. > Can anyone provide some pointers (no pun intended) on this? > > Thanks > Saptarshi > > ANN* book; > int* foot; > > void foo(void){ > Rprintf("many times\n"); > Rprintf("%p\n",book); > Rprintf("%p\n",foot); > } > > SEXP > kNN_e(SEXP data, SEXP Nrow, SEXP Ncol,SEXP K,SEXP Eps) > { > int nrow=asInteger(Nrow); > int ncol=asInteger(Ncol); > int k=asInteger(K); > double eps=asReal(Eps); > > SEXP ans,distance; > SEXP retlist; > PROTECT(ans=allocMatrix(INTSXP,nrow,k)); //The 2nd argument gives > the number of rows, and the last the number of cols see http://cran.r- > project.org/doc/manuals/R-exts.html > PROTECT(distance=allocMatrix(REALSXP,nrow,k)); > ANNpointArray datapoints; > ANNpoint qpoint; > ANNkd_tree* kdTree; > book=Calloc(1,ANN*); > foot=Calloc(1,int); > book=kdTree; > *foot=10; > > ....... > } > > extern "C" { > void do_foo(void){ > foo(); > } > > SEXP > do_kNN_e(SEXP data, SEXP Nrow, SEXP Ncol,SEXP k,SEXP eps) > { > return kNN_e(data,Nrow, Ncol, > k,eps); > > } > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at stat.math.ethz.ch 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.Saptarshi Guha | sapsi at pobox.com | http://www.stat.purdue.edu/~sguha Would you people stop playing these stupid games?!?!?!!!!