• Subject: Re: Embedding lua - passing arrays, multidimensional arrays
• From: Ervin Hegedüs <airween@...>
• Date: Thu, 24 Sep 2015 11:21:56 +0200

```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?