On Wed, 5 Mar 2008, Ramon Diaz-Uriarte wrote: > Dear Jeff, > > Thanks for the suggestion. However, something is still not working. > This is a simple example: > > *************************** start C ************ > #include <R.h> > > struct Sequence { > int len; > unsigned int state_count[]; > }; > > > int main(void) { > > struct Sequence *A; > int n = 4; > > // First line segfaults. Second doesn't > A = (struct Sequence *) R_alloc(1, sizeof(struct Sequence) + n * > sizeof(unsigned int)); > // A = malloc(sizeof(struct Sequence) + n * sizeof(unsigned int)); > > return(0); > } > > *********** end C ********** > > > I then do > gcc -std=gnu99 -Wall -I/usr/share/R/include -I/usr/share/R/include > -L/usr/lib/R/lib -lR ex7.c > > and the ./a.out segfaults when I use R_alloc (not with malloc).
You can't use R_alloc in a standalone program without initializing R, which has not been done here. You said 'in a package', but this is not in a package. > > > Best, > > R. > > On Wed, Mar 5, 2008 at 5:23 PM, Jeffrey Horner > <[EMAIL PROTECTED]> wrote: >> Ramon Diaz-Uriarte wrote on 03/05/2008 04:25 AM: >> >> >>> Dear All, >> > >> > In a package, I want to use some C code where I am using a structure >> > (as the basic element of a linked list) with flexible array members. >> > Basically, this is a structure where the last component is an >> > incomplete array type (e.g., Harbison & Steel, "C, a reference >> > manual, 5th ed.", p. 159) such as: >> > >> > struct Sequence { >> > struct Sequence *next; >> > int len; >> > unsigned int state_count[]; >> > }; >> > >> > >> > To create one such sequence, I allocate storage (following Harbison >> > and Steel) in a C program as follows: >> > >> > struct Sequence *A; >> > int n = 4; >> > A = malloc( sizeof(struct Sequence) + n * sizeof(unsigned int)); >> > >> > >> > If I understand correctly, however, it would be better to use R_alloc >> > instead of malloc (memory automagically freed on exit and error; >> > error-checking). But I do not know how to make the call to R_alloc >> > here, since R_alloc allocates n units of size bytes each. >> > >> > >> > I've tried, without success, the following two: >> > >> > int to_add_for_R_alloc = >> > (int) ceil((float) sizeof(struct sequence) / sizeof(unsigned int)); >> > >> > A = (struct sequence *) R_alloc(to_add_for_R_alloc + n, >> > sizeof(unsigned int)); >> > >> > or even a brute force attempt as: >> > >> > A = (struct sequence *) R_alloc( 100, sizeof(struct sequence)); >> > >> > >> > but both result in segmentation faults. >> > >> > >> > Should I just keep using malloc (and free at end)? >> >> Hi Ramon, >> >> You should be able to use R_alloc without seg faults, so there's >> something wrong with your code somewhere. R_alloc multiplies its >> arguments together to come up with the total number of bytes to allocate >> then it allocates a raw vector and returns the data portion. >> >> So you can just treat R_alloc similarly to malloc by calling >> R_alloc(1,sizeof(struct Sequence) + n * sizeof(unsigned int)). >> >> Best, >> >> Jeff >> -- >> http://biostat.mc.vanderbilt.edu/JeffreyHorner >> > > > > -- > Ramon Diaz-Uriarte > Statistical Computing Team > Structural Biology and Biocomputing Programme > Spanish National Cancer Centre (CNIO) > http://ligarto.org/rdiaz > > ______________________________________________ > 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. > -- Brian D. Ripley, [EMAIL PROTECTED] 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 ______________________________________________ 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.