Frage

Ich möchte eine Tabelle erstellen, wie

myTable = {
    [0] = { ["a"] = 4, ["b"] = 2 },
    [1] = { ["a"] = 13, ["b"] = 37 }
}

den C-API verwenden?

Mein aktueller Ansatz ist

lua_createtable(L, 0, 2);
int c = lua_gettop(L);
lua_pushstring(L, "a");
lua_pushnumber(L, 4);
lua_settable(L, c);
lua_pushstring(L, "b");
lua_pushnumber(L, 2);
lua_settable(L, c);

die inneren Tabellen in einer Schleife zu erstellen. Bevor diese Schleife, verwende ich

lua_createtable(L, 2, 0);
int outertable = lua_gettop(L);

die äußere Tabelle 2 numerische Schlitze erstellen.

Aber wie kann ich die inneren Tabellen der äußeren Tabelle speichern?

War es hilfreich?

Lösung

Hier ist ein vollständiges und Minimalprogramm zeigt, wie Tabellen zu nisten. Im Grunde, was Sie fehlt, ist die lua_setfield Funktion.

#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int main()
{
    int res;
    lua_State *L = lua_open();
    luaL_openlibs(L);

    lua_newtable(L); /* bottom table */

    lua_newtable(L); /* upper table */

    lua_pushinteger(L, 4);
    lua_setfield(L, -2, "four"); /* T[four] = 4 */
    lua_setfield(L, -2, "T");  /* name upper table field T of bottom table */
    lua_setglobal(L, "t"); /* set bottom table as global variable t */

    res = luaL_dostring(L, "print(t.T.four == 4)");
    if(res)
    {
        printf("Error: %s\n", lua_tostring(L, -1));
    }

    return 0;
}

Das Programm wird einfach drucken true.

Wenn Sie numerische Indizes benötigen, dann verwenden Sie weiterhin lua_settable :

#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int main()
{
    int res;
    lua_State *L = lua_open();
    luaL_openlibs(L);

    lua_newtable(L); /* bottom table */

    lua_newtable(L); /* upper table */

    lua_pushinteger(L, 0);
    lua_pushinteger(L, 4);
    lua_settable(L, -3);  /* uppertable[0] = 4; pops 0 and 4 */
    lua_pushinteger(L, 0);
    lua_insert(L, -2); /* swap uppertable and 0 */
    lua_settable(L, -3); /* bottomtable[0] = uppertable */
    lua_setglobal(L, "t"); /* set bottom table as global variable t */

    res = luaL_dostring(L, "print(t[0][0] == 4)");
    if(res)
    {
        printf("Error: %s\n", lua_tostring(L, -1));
    }

    return 0;
}

Statt mit absoluter Indizes von 0 wie ich habe, möchten Sie vielleicht verwenden lua_objlen den Index zu erzeugen.

Andere Tipps

Für den einfachen Code wie die, die Sie gaben, meine lua2c funktioniert gut und erzeugt den Code unten.

/* This C code was generated by lua2c from the Lua code below.

myTable = {
    [0] = { ["a"] = 4, ["b"] = 2 },
    [1] = { ["a"] = 13, ["b"] = 37 }
}
*/
static int MAIN(lua_State *L)
{
 lua_newtable(L);
 lua_pushnumber(L,0);
 lua_newtable(L);
 lua_pushliteral(L,"a");
 lua_pushnumber(L,4);
 lua_pushliteral(L,"b");
 lua_pushnumber(L,2);
 lua_settable(L,-5);
 lua_settable(L,-3);
 lua_pushnumber(L,1);
 lua_newtable(L);
 lua_pushliteral(L,"a");
 lua_pushnumber(L,13);
 lua_pushliteral(L,"b");
 lua_pushnumber(L,37);
 lua_settable(L,-5);
 lua_settable(L,-3);
 lua_settable(L,-5);
 lua_settable(L,-3);
 lua_setglobal(L,"myTable");
 return 0;
}

Hier ist etwas generic kam ich ein ähnliches Problem zu lösen, basierend auf lhf Antwort. Dies wird eine Lua-Tabelle für das Formular erstellen

{
    {"foo"},
    {"bar", "baz"}
}

Mit beliebigem Tisch / Untertischlänge.

int list_of_lists_to_lua(lua_State* L, const std::vector<std::vector<std::string>>& convertme) {
    lua_newtable(L);
    int counter = 0;
    for (const std::vector<std::string>& list : convertme) {
        lua_pushnumber(L, ++counter);
        lua_newtable(L);
        int counter2 = 0;
        for (const std::string& item : list) {
            lua_pushnumber(L, ++counter2);
            lua_pushstring(L, item);
            lua_settable(L,-3);
        }
        lua_settable(L,-3);
    }
    return 1;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top