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 14:01:18 -0400

On Jul 10, 2007, at 12:33 PM, Saptarshi Guha wrote:

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

One quick solution, change the function foo, to SEXP foo(SEXP s){
...
return(s)
}
and make corresponding changes elsewhere. This should work. Regards
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-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 What ever happened to happily ever after?



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed 11 Jul 2007 - 08:29:57 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 - 12:36:29 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.