• C/C++调用Lua的table


    本文转自:http://xxnull.blog.163.com/blog/static/176398157201181991147848/

    首先,我们来简单了解一下lua中的Table。Table是lua中唯一内置的数据结构类型。也就是说,它没有内置list、array、map、 set等等数据结构类型。在lua里面那些数据类型都是通过Table来实现的。在lua中的,Table是非常强大和重要的。当我们需要将lua嵌入到 应用程序里面的时候,不可避免的需要操作Table。本文就来讨论一下如何在C语言中读取Lua中Table的内容。
           其实,Lua中Table是array与map的混合。它即可想array一样使用index去访问,也可以像map一样通过key去访问。关键在于你是 如何定义。当你定义Table是没有使用key时,你就可以认为它是array,通过index访问他的成员;当你定义时使用了key,就可以认为它是 map,通过key来访问它的成员。当然,这两种还可以混合起来使用。所以,我们可以这样来定义一个Table
    tlb={} --定义了一个空的Table。
    tlb={1, 2, 3, 4} --定义可以用index访问的Table。
    print(tlb[1] .. ", " .. tlb[4])             -- 输出:1, 4
    tlb={a=1, b=2, c=3, d=4} --定义可以用key访问的Table。
    print(tlb.a .. ", " .. tlb.b)             -- 输出:1, 4

    tlb={a=1, b=2, 3, 4} --定义一个混合的Table。
    print(tlb.c .. ", " .. tlb[1])             -- 输出:1, 3
    请注意:tlb[1]等于3而不是1。至于为什么,读者可以自己思考一下。
    其实,上面的key是字符串。之所以没有带引号是因为lua提供了语法糖。原始的定义应该如下:
    tlb={["a"]=1, ["b"]=2}
    访问应该是:tlb["a"]

    OK,我们现在对Lua中的Table已经有了最基本的了解了。我们来了解一下如何在C/C++中读取Table的内容。非常简单,直接上代码:
    ReadLuaTable.lua

    luat_Test1={a=123, b=456, c=789}
    luat_Test2={123, 456, 789}


    ReadLuaTable.cpp

    #include <lua.hpp>

    static void ReadTableFromItem(lua_State *L, const char* lpszTableName, const char* lpszTableItem)
    {
        lua_getglobal(L, lpszTableName);
        
        lua_pushstring(L, lpszTableItem);
        lua_gettable(L, -2);
        printf("%s.%s=%d ", lpszTableName, lpszTableItem, (int)lua_tonumber(L, -1));
        lua_pop(L, 2);
    }

    static void ReadTableFromIndex(lua_State *L, const char* lpszTableName, int index)
    {
        lua_getglobal(L, lpszTableName);
        lua_rawgeti(L, -1, index);
        printf("%s[%d]=%d ", lpszTableName, index, (int)lua_tonumber(L, -1));
        lua_pop(L, 2);
    }

    static void EnumTableItem(lua_State *L, const char* lpszTableName)
    {
        lua_getglobal(L, lpszTableName);
        int it = lua_gettop(L);
        lua_pushnil(L);
        printf("Enum %s:", lpszTableName);
        while(lua_next(L, it))
        {
            printf("  %d", (int)lua_tonumber(L, -1));
            lua_pop(L, 1);
        }
        printf(" ");
        lua_pop(L, 1);
    }

    int main (int argc, char* argv[])
    {
        lua_State *L = lua_open();
        luaopen_base(L);
        
        luaL_dofile(L, "LuaTable.lua");
        ReadTableFromItem(L, "luat_Test1", "a");  // 等价与lua代码:print(luat_Test1.a)
        ReadTableFromItem(L, "luat_Test1", "b");
        ReadTableFromItem(L, "luat_Test1", "c");
        EnumTableItem(L, "luat_Test1");    // 枚举Table
        
        ReadTableFromIndex(L, "luat_Test2", 1);  // 等价与lua代码:print(luat_Test1[1])
        ReadTableFromIndex(L, "luat_Test2", 2);
        ReadTableFromIndex(L, "luat_Test2", 3);
        EnumTableItem(L, "luat_Test2");
        lua_close(L);
        return 0;
    }


    makefile

    CFLAG=`pkg-config --cflags lua5.1`
    LDFLAG=`pkg-config --libs lua5.1`
    CC=g++
    all: ReadLuaTable
    ReadLuaTable : ReadLuaTable.cpp
        $(CC) -o $@ $(CFLAG) $(LDFLAG) $<

     
    测试环境:
    OS:Ubuntu 11.04
    Lua:5.1.4

    运行结果:

    C读取Lua中Table的内容 - xxNull - xxNull的博客
  • 相关阅读:
    NC外部统一流程管理平台方案
    Activiti 多个并发子流程的应用
    基于Activiti的流程应用开发平台JSAAS-WF V5.3
    整合Acitiviti在线流程设计器(Activiti-Modeler 5.18.0)
    基于Spring Security 的JSaaS应用的权限管理
    微信分享功能开发
    ORACLE schedule job设置
    存储过程清理N天前数据
    oracle函数trunc的使用
    往前往后推时间(排除工作日和节假日)
  • 原文地址:https://www.cnblogs.com/live-in-city/p/3286841.html
Copyright © 2020-2023  润新知