[R] R_alloc with structures with "flexible array members"
Ramon Diaz-Uriarte
rdiaz02 at gmail.com
Thu Mar 6 12:47:04 CET 2008
Humm... but I mistakenly thought I was assuming almost nothing.
R.
On Wed, Mar 5, 2008 at 10:38 PM, Jeffrey Horner
<jeff.horner at vanderbilt.edu> wrote:
> Ramon Diaz-Uriarte wrote on 03/05/2008 03:00 PM:
>
> > Dear Prof. Ripley,
> >
> > Yes, of course! You are right. What a silly mistake on my part! I was
> > using a standalone program for development of functions, debugging,
> > etc, of what is part of a package.
>
> Aha! The lesson I take away from this then is question everything,
> assume nothing.
>
> Jeff
>
>
>
> >
> > Thanks,
> >
> > R.
> >
> >
> >
> > On Wed, Mar 5, 2008 at 8:45 PM, Prof Brian Ripley <ripley at stats.ox.ac.uk> wrote:
> >> 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
> >> > <jeff.horner at vanderbilt.edu> 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 at 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, ripley at 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
>
--
Ramon Diaz-Uriarte
Statistical Computing Team
Structural Biology and Biocomputing Programme
Spanish National Cancer Centre (CNIO)
http://ligarto.org/rdiaz
More information about the R-help
mailing list