From sapsi at pobox.com  Tue Jul 10 18:33:26 2007
From: sapsi at pobox.com (Saptarshi Guha)
Date: Tue, 10 Jul 2007 12:33:26 -0400
Subject: [Rd] [R] How to preserve data across function calls in a
	library package
In-Reply-To: <6F70270F-4DF1-4D34-8444-FCBF8F035030@pobox.com>
References: <6F70270F-4DF1-4D34-8444-FCBF8F035030@pobox.com>
Message-ID: <A00673FA-F462-4CD4-8D3C-03DE3B9CC2C6@pobox.com>

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?!?!?!!!!



[Rd] [R] How to preserve data across function calls in a library package
Saptarshi Guha