[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: lua userdata question
- From: Ted Unangst <ted.unangst@...>
- Date: Sun, 17 Jan 2010 17:44:17 -0500
On Sun, Jan 17, 2010 at 5:29 PM, Kuang Chen <kchenphy@gmail.com> wrote:
> Hi,
> I would like to define an array with the following structure:
>
> typedef struct
> {
> int size;
> double x_values[1]; /* x variable part */
> double y_values[1]; /* y variable part */
> } PairArray;
>
> As you can see, it is quite similar to the NumArray defined in
> ch28, pil, with the only difference being that there are a pair of
> values (x,y) for each index. The size of PairArray is provided by user
> at run time. Therefore, I wrote a "new" function for PairArray , which
> is again similar to the one on pil:
>
> static PairArray PairArray_alloc(lua_State *L, int size)
> {
> size_t nbytes = sizeof(PairArray) + 2*sizeof(double)*(size-1);
> PairArray* p = (PairArray*)lua_newuserdata(L, nbytes);
You didn't get to the question, but I think I can guess it. This code
is wrong because without special handling, your two arrays will
overlap. I find it much easier to use pointers.
struct pairarray { double *x, double *y; };
p = lua_newuserdata(L, sizeof(*p) + sizeof(double) * 2 * size);
p->x = (double *)(p + 1);
p->y = p->x + size;
Technically, you use a little more memory for the pointers. Really, I
don't think it matters and it's more understandable.