zoukankan      html  css  js  c++  java
  • Lua和C++交互 学习记录之四:全局table交互

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍)

    部分内容查阅自:《Lua 5.3  参考手册》中文版 译者 云风 制作 Kavcc

     

    vs2013+lua-5.3.3

     

    1.C++读取Lua中的table

    ①在hello.lua中设置一个全局table:

    global_c_read_table = {integer_val = 1,double_val = 2.34,string_val = "test_string"}

    ②在C++中读取

     

     1     //lua->stack,得到全局表,位置-1
     2     lua_getglobal(L, "global_c_read_table");
     3 
     4     //-------------------得到第一个值----------------------------
     5     //c->statck,设置key值,位置-1(上面的-1变为-2)
     6     lua_pushstring(L, "integer_val");
     7 
     8     //lua->statck,将-1位置的key值弹出,从lua中得到对应key的值,并将结果放在-1的位置
     9     //如果没有值,则结果为TNIL
    10     lua_gettable(L, -2);//返回值为值的类型
    11 
    12     //statck->c
    13     if (lua_isinteger(L, -1)){
    14         printf("integer_val : %lld
    ", lua_tointeger(L, -1));
    15     }
    16 
    17     //弹出-1位置的结果,之后全局表的位置恢复到-1
    18     lua_pop(L, 1);
    19 
    20     //-------------------重复上述步骤,得到第二个值----------------------------
    21     lua_pushstring(L, "double_val");
    22     lua_gettable(L, -2);//返回值为值的类型
    23     if (lua_isnumber(L, -1)){
    24         printf("double_val : %g
    ", lua_tonumber(L, -1));
    25     }
    26     lua_pop(L, 1);
    27     //-------------------重复上述步骤,得到第三个值----------------------------
    28     lua_pushstring(L, "string_val");
    29     lua_gettable(L, -2);//返回值为值的类型
    30     if (lua_isstring(L, -1)){
    31         printf("string_val : %s
    ", lua_tostring(L, -1));
    32     }
    33     lua_pop(L, 1);

     

    ③lua_getfield函数 

    //使用lua_getfield代替lua_pushxxx和lua_gettable两个函数,返回值为值的类型
    lua_getfield(L, -1, "integer_val");

     

    在 Lua 中,这个函数可能触发对应 "index" 事件对应的元方法。

    在后面的 绑定C++类在Lua中面向对象 会使用到其对应的lua_setfield方法。

     

    2.C++将table写入Lua

    ①C++写入

     1         //c->stack,创建一个新的table放到-1的位置
     2         lua_newtable(L);
     3 
     4         //c->stack,增加一个key,放在-1的位置,table位置变为-2
     5         lua_pushstring(L, "integer_val");
     6 
     7         //c->stack,增加key对应的值,放在-1位置,key位置变为-2,table位置变为-3
     8         lua_pushinteger(L, 1);
     9         
    10         //将key和val设置到table中,并弹出key和val,此时table位置变为-1
    11         lua_settable(L, -3);
    12 
    13         //stack->lua,将table赋值到lua中,并弹出table
    14         lua_setglobal(L, "global_c_write_table");

    ②在hello.lua中进行Lua读取

    1 for k,v in pairs(global_c_write_table) do 
    2     print("k = ",k," v = ",v)
    3 end

     

    3.其它常用table函数

     

    ①LUA_API int (lua_rawget) (lua_State *L, int idx);

    类似于 lua_gettable , 但是作一次直接访问(不触发元方法),速度更快。

    返回值为值的类型。

     

    ②LUA_API void  (lua_rawset) (lua_State *L, int idx); 

    类似于 lua_settable , 但是是做一次直接赋值(不触发元方法),速度更快。

    返回值为值的类型。

     

    Lua和C++交互系列:

    Lua和C++交互 学习记录之一:C++嵌入脚本

    Lua和C++交互 学习记录之二:栈操作

    Lua和C++交互 学习记录之三:全局值交互

    Lua和C++交互 学习记录之四:全局table交互

    Lua和C++交互 学习记录之五:全局数组交互

    Lua和C++交互 学习记录之六:全局函数交互

    Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块

    Lua和C++交互 学习记录之八:C++类注册为Lua模块

    Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

  • 相关阅读:
    nginx一键安装脚本
    nginx动静分离之后,设置默认主页
    日志备份
    cc高防主机部署
    原型和原型链
    Git&Github分支
    Git&Github基础
    传输层协议TCP&UDP
    本地库与远程库交互
    SVG
  • 原文地址:https://www.cnblogs.com/chevin/p/5889119.html
Copyright © 2011-2022 走看看