[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Embedding lua - passing arrays, multidimensional arrays
- From: Dirk Laurie <dirk.laurie@...>
- Date: Thu, 24 Sep 2015 13:05:34 +0200
2015-09-24 11:21 GMT+02:00 Ervin Hegedüs <airween@gmail.com>:
> Hi Lua-l list,
>
>
> On Wed, Sep 23, 2015 at 10:35:21AM +0200, Michal Kottman wrote:
>>
>> Instead, take a look at Programming in Lua, especially
>> http://www.lua.org/pil/24.2.html to learn about accessing Lua from C using
>> the stack. The book is written for Lua 5.0, but still very relevant even
>> with 5.3.
>
> so, I've read the documents above - that's very-very clear. Now I
> think I understand the stack - it's not just very funny, it has
> cold logic, and pure implementation.
>
> Here is the sample code, what I tries first - and there is the
> state of stack, to help me to clarify the working of Lua stack.
>
> Please review and comment it - em I understanding right it?
>
> /*
> myTable = {
> [0] = { ["a"] = 4, ["b"] = 2 },
> [1] = { ["a"] = 13, ["b"] = 37 }
> } */
>
> 1. lua_newtable(L); // -1: myTable
>
> 2. lua_pushnumber(L,0); // myTyble 0. index
> // -2: myTable, -1: 0
>
> 3. lua_newtable(L); // myTable[0], -3: myTable, -2: 0, newtable0: -1
> 4. lua_pushliteral(L,"a"); // -4: myTable, ..., -2: newtable0, -1: "a"
> 5. lua_pushnumber(L,4); // -5: myTable, ... -1: 4
> 6. lua_pushliteral(L,"b"); // -6: myTable, ... -1: "b"
> 7. lua_pushnumber(L,2); // -7: myTable, ... -5: newtable0, -1: 2
> 8. lua_settable(L,-5); // set k=v pairs to newtable0 from top, on index -5
> // items -1 and -2 will popped
> // -5: myTable, -4: 0, -3: newtable0
> 9. lua_settable(L,-3); // set k=v pairs to newtable0 from top, on index -3
> // items -1 and -2 will popped
> // -3: myTable, -2: 0, -1: newtable0
> 10. lua_pushnumber(L,1); // -4: myTable, -3: 0, -2: newtable0, -1: 1
> 11. lua_newtable(L); // -5: myTable, -4: 0, -3: newtable0, -2: 1, -1: newtable1
> 12. lua_pushliteral(L,"a"); // -6: myTable, ... -1: "a"
> 13. lua_pushnumber(L,13); // -7: myTable, ... -2: "a", -1: 13
> 14. lua_pushliteral(L,"b"); // -8: myTable, ... -1: "b"
> 15. lua_pushnumber(L,37); // -9: myTable, ... -2: "b", -1: 37
> 16. lua_settable(L,-5); // -10: myTable, -9: index 0, -8: newtable0, ... -5: newtable1
> // set k=v pairs to newtable1 on index -5
> // items -1 and -2 will popped
> // -7: myTable, ..., -3: newtable1, -2: index a, -1: 13
> 17. lua_settable(L,-3); // set k=v pairs to newtable1 from top, on index -3
> // items -1 and -2 will popped
> // -5: myTable, -4: 0, -3: newtable0, -2: 1, -1: newtable1
> 18. lua_settable(L,-5); // set k=v pairs from top, in this case 1=newtable1
> // -3: myTable, -2: 0, -1: newtable0
> 19. lua_settable(L,-3); // set k=v pairs from top, 0=newtable0
> 20. lua_setglobal(L,"t"); // set table above to "t" variable in Lua, pop it from stack
> // stack is empty
>
> Note, that if I think it right, in the step 8 (lua_settable(L, -5))
> I could use this: lua_settable(L, 3), because the newtable0 is
> 5th element from top, and 3rd element from bottom? Em I right?
>
>
> Thanks for your pations, and for your helps,
You are making life needlessly complicated. Many of the things
you do don't need Lua values, C values are fine.
The main table is more easily populated with lua_seti.
If you rewrite your Lua code as:
> /*
> myTable = {
> [0] = { a = 4, b = 2 },
> [1] = { a = 13, b = 37 }
> } */
>
you can populate the subtables with lua_setfield.
- References:
- Embedding lua - passing arrays, multidimensional arrays, Ervin Hegedüs
- Re: Embedding lua - passing arrays, multidimensional arrays, steve donovan
- Re: Embedding lua - passing arrays, multidimensional arrays, Ervin Hegedüs
- Re: Embedding lua - passing arrays, multidimensional arrays, Michal Kottman
- Re: Embedding lua - passing arrays, multidimensional arrays, Ervin Hegedüs