lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Wow, I just learned more from one mailing list post than 2 days of
Googling. Thanks.

On 6/26/06, Mark Edgar <medgar@student.gc.maricopa.edu> wrote:
ice wrote:
> How can I access tables within tables? My data is structured as so:
> entity =
> {
>    s =
>    {
>        pos =
>        {
>            trType = 0,
>            trTime = 0,
>            trDuration = 0,
>            trBase = {128, 128, 128}
>            trDelta = {0, 0, 0}
>        }
>    },
>    r =
>    {
>        currentOrigin = {256, 256, 256}
>    }
> }
> I need to be able to access all of that data. Would I just repeatedly
> call lua_pushstring with the new key and then call lua_gettable? What
> about accessing the array data? Any help would be appreciated.

Here are a couple of examples complete with stack comments.  I assume
that 'entity' is an index in the LUA_GLOBALINDEX of the function which
contains this code.

/* access (entity.s.pos.trDuration) */
lua_getglobal(L, "entity");           /* entity */
lua_getfield(L, -1, "s");             /* entity s */
lua_getfield(L, -1, "pos");           /* entity s pos */
lua_getfield(L, -1, "trDuration");    /* entity s pos trDuration */
int n = lua_tonumber(L, -1);

/* access (entity.r.currentOrigin[1]) */
lua_getglobal(L, "entity");           /* entity */
lua_getfield(L, -1, "r");             /* entity r */
lua_getfield(L, -1, "currentOrigin"); /* entity r currentOrigin */
lua_rawgeti(L, -1, 1);                /* entity r currentOrigin [1] */
int n = lua_tonumber(L, -1);

Note that lua_getfield(), lua_getglobal(), and lua_gettable() may
trigger a metamethod, but that lua_rawgeti() will not.

                                        -Mark



--
43rd Law Of Computing: Anything that can go wro

sig: segmentation fault: core dumped