Re: [Rd] [R] How to preserve data across function calls in a library package

From: Saptarshi Guha <sapsi_at_pobox.com>
Date: Tue, 10 Jul 2007 12:33:26 -0400

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@pobox.com | http://www.stat.purdue.edu/~sguha Would you people stop playing these stupid games?!?!?!!!!



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Tue 10 Jul 2007 - 17:07:15 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 11 Jul 2007 - 11:36:17 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.