سؤال

أريد إنشاء جدول مثل

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

باستخدام واجهة برمجة التطبيقات C؟

نهجي الحالي هو

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);

لإنشاء الجداول الداخلية في حلقة.من قبل، هذه الحلقة، أستخدمها

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

لإنشاء الجدول الخارجي لفتحتين رقميتين.

ولكن كيف يمكنني حفظ الجداول الداخلية في الجدول الخارجي؟

هل كانت مفيدة؟

المحلول

وفيما يلي البرنامج الكامل، والحد الأدنى مما يدل على كيفية عش الجداول. أساسا ما كنت في عداد المفقودين هو lua_setfield وظيفة.

#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;
}

وسيقوم البرنامج ببساطة طباعة true.

إذا كنت تحتاج إلى مؤشرات رقمية، ثم كنت لا تزال تستخدم 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;
}

وبدلا من استخدام المؤشرات المطلقة 0 وكأنني لم، قد ترغب في استخدام lua_objlen لتوليد المؤشر.

نصائح أخرى

للحصول على رمز بسيط مثل الذي قدمته، my lua2c يعمل بشكل جيد ويولد الكود أدناه.

/* 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;
}

وهنا هو شيء عام خطرت لي على حل مشكلة مماثلة، استنادا إلى الإجابة LHF ل. وهذا إنشاء جدول لوا للنموذج

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

ومع الجدول التعسفي / طول الجدول الفرعي.

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top