Hello. I'm trying to read a delimited file. I'm a little new to the R api. In the program, I do something like this... /*****************************/ SEXP retval; PROTECT(retval = allocMatrix(STRSXP,1,names.dim)); int r_eltctr = 0; while(!myfile.eof()) { SET_LENGTH(retval,r_eltctr+num_of_fields); for(int i = 0;numofcolumns; ++i) { INTEGER(retval)[r_eltctr++] = 1;/*some value...*/ } ++r_eltctr; } UNPROTECT(1); /***************************************/ There is a segmentation fault when SET_LENGTH() is called several iterations into the program. It seems like it should not be a memory issue, unless a constraint is set by R. The vector only has about 3500 elements at the time it crashes. Does anyone have any ideas what the problem could be?
Prof Brian Ripley
2005-Apr-17 09:10 UTC
[Rd] Using lengthgets() correctly (was SET_LENGTH)
If you use R not the S-compatibility macros you will be less likely to confuse yourself. The definition is (analogous to realloc) Rdefines.h:#define SET_LENGTH(x, n) (x = lengthgets(x, n)) so x is changed and needs to be reprotected. [I don't know that SET_LENGTH *is* part of the API: it is not defined in `Writing R Extensions'.] Your error will potentially occur at the first garbage collection. Try using REPROTECT. Note though that what you are doing is very inefficient, and re-setting the length without changing the dim is also an error. What R's internal examples do is to allocate a modest vector, double in size when needed, call lengthgets to shorten at the end, then set the dim attribute. On Sat, 16 Apr 2005, Larry Tordsen wrote:> Hello. > > I'm trying to read a delimited file. I'm a little new > to the R api. In the program, I do something like > this... > > /*****************************/ > SEXP retval; > PROTECT(retval = allocMatrix(STRSXP,1,names.dim)); > int r_eltctr = 0; > while(!myfile.eof()) > { > SET_LENGTH(retval,r_eltctr+num_of_fields); > for(int i = 0;numofcolumns; ++i) > { > INTEGER(retval)[r_eltctr++] = 1;/*some > value...*/ > } > ++r_eltctr; > } > UNPROTECT(1); > /***************************************/ > > There is a segmentation fault when SET_LENGTH() is > called several iterations into the program. It seems > like it should not be a memory issue, unless a > constraint is set by R. The vector only has about > 3500 elements at the time it crashes. > > Does anyone have any ideas what the problem could be?The problem seems to be the assumption that R (and not the user) was at fault. -- Brian D. Ripley, ripley@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595