The problem almost certainly lies in the parts of the code that you have not shown, the R-language code including the .Call or, more likely in my opinion, the C++ code for Projector. You can get different values in Projector's Lsum matrix if (a) Projector doesn't assign values to all of them (allocMatrix allocates memory with random contents - you must fill it with values) (b) Projector reads or writes memory that it doesn't own. Using valgrind can help find both sorts of errors.
I am suspicious about your reversal of the dimensions of Lsum when you allocate it, using dimG[1],dimG[0]. Does this mean you are doing some odd pointer arithmetic in Projector that doesn't agree with R's conventions? I tried adding a simple Projector() and saw no problems aside from the random numbers in the unassigned elements of Lsum and some of the usual unassign values in the guts of Rprintf's formatting code. extern "C" { SEXP Projector5(SEXP L, SEXP G, SEXP W, SEXP xymod, SEXP modif); } //* the Projector part *// void Projector(double *L, int *dimL, double *G, int *dimG, double *W, int *dimW, int *xymod, int *dimxy, double *modif, int *dimif, double *Lsum) { Rprintf("dimG=c(%d,%d)\n", dimG[0], dimG[1]); double* pLsum = Lsum; bool even = true ; for(int j=0 ; j < dimG[0] ; j++) { for(int i=0 ; i < dimG[1] ; i++) { if (even) { *pLsum = 1000 * (i+1) + (j+1); } else { // do not touch odd elements of pLsum } even = !even; pLsum++; } } } called with > .Call("Projector5", matrix(1:6,2,3), matrix(701:720,4,5), > matrix(2^(1:12),2,6), 1:7, 1:10) dimG=c(4,5) [,1] [,2] [,3] [,4] [1,] 1001 7.954e-322 1003 4.002e-322 [2,] 0 2.002e+03 0 2.004e+03 [3,] 3001 0.000e+00 3003 0.000e+00 [4,] 0 4.002e+03 0 4.004e+03 [5,] 5001 0.000e+00 5003 0.000e+00 Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -----Original Message----- > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > Behalf > Of Shangru Li > Sent: Sunday, December 16, 2012 10:20 AM > To: r-help@r-project.org > Subject: [R] interfacing with .Call > > Hi > > My code is as following: > > #include <R.h> > #include <Rinternals.h> > > //* the Projector part *// > void Projector(double *L, int *dimL, double *G, int *dimG, double *W, int > *dimW, int *xymod, int *dimxy, double *modif, int *dimif, double *Lsum) > { ...} > > //* the interface part *// > #define getDim(A) INTEGER(coerceVector(getAttrib(A,R_DimSymbol), INTSXP)) > > SEXP Projector5(SEXP L, SEXP G, SEXP W, SEXP xymod, SEXP modif) > { > //* digest SEXPs from R *// > int *dimL, *dimG, *dimW, *dimxy, *dimif; > double *lptr, *gptr, *wptr, *ifptr; > int *xyptr; > dimL=getDim(L); > PROTECT(L=coerceVector(L, REALSXP)); > lptr=REAL(L); > dimG=getDim(G); > PROTECT(G=coerceVector(G, REALSXP)); > gptr=REAL(G); > dimW=getDim(W); > PROTECT(W=coerceVector(W, REALSXP)); > wptr=REAL(W); > dimxy=getDim(xymod); > PROTECT(xymod=coerceVector(xymod, INTSXP)); > xyptr=INTEGER(xymod); > dimif=getDim(modif); > PROTECT(modif=coerceVector(modif, REALSXP)); > ifptr=REAL(modif); > > //* create SEXP to hold the answer *// > SEXP ans; > double *ansptr; > PROTECT(ans=allocMatrix(REALSXP, dimG[1], dimG[0])); > ansptr=REAL(ans); > > //* calculate the result *// > Projector(lptr, dimL, gptr, dimG, wptr, dimW, xyptr, dimxy, ifptr, > dimif, ansptr); > > //* wrap up and return the result to R *// > UNPROTECT(6); > return(ans); > } > > The function "Projector" works well and actually the interface with .C > works OK. > The question is that I can compile it in R, but ".Call" returns different > result each time with same inputs. Could anybody tell me why? Thanks! > > Regards > Shangru > > -- > Department of Mathematics, > National University of Singapore, > Blk S17, 10 Lower Kent Ridge Road, > 119076 > > > > > > -- > Department of Mathematics, > National University of Singapore, > Blk S17, 10 Lower Kent Ridge Road, > 119076 > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org 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. ______________________________________________ R-help@r-project.org 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.