zoukankan      html  css  js  c++  java
  • lua与C交互关键函数

    1lua_next(L, t_idx)

    参数解释:

    L:虚拟机

    t_idxtable在栈中索引

    返回

    int0执行失败;非0执行成功

    该函数的执行流程为:

    :先从栈顶弹出一个key

    :从栈指定位置的table中取下一对key-value对,先将key入栈,再将value入栈;

    :如果成功则返回非0值;否则返回0,并且不向栈中压入任何值;

    说明:第步中从table里面取出"下一对key-value"值是相对于第步中弹出的key的,

    table里面第一对key-value前面没有数据,所以先用lua_pushnil()压入一个nil值作为初始key

    到了table中已经没有key-value时,不会向栈中插入新的key-value对,这时lua_next()返回0

    循环结束;

    C里面可以使用lua_gettable()lua_rawget()函数获取表中数据,但是你事先需知晓索引名称;

    使用lua_next()的好处是,可以事先不知道这些信息;

    ----------------------------------------------------------------------------------------------------------

    2lua_gettable(L, t_idx)

    参数解释:

    L:虚拟机

    t_idxtable在栈中索引

    函数执行流程为:

    :取栈顶元素的值,以该值作为key,到t_idx指定的table中去取对应的value

    :弹出key,并压入取到的value


    ----------------------------------------------------------------------------------------------------------

    3lua_getglobal(L, key)

    参数

    L:虚拟机

    key:宿主程序想要获取的变量的名称

    返回

    void

    执行流程:

    :宿主会将名称key置于栈的顶部,此时栈包含一个元素;

    lua取得这个key后,清除栈中这个key(此时栈顶不包含元素),并到lua的全局表中查找这个key对应的value

    :若全局表找到对应的value,将这个值压入栈顶(宿主程序可以取用);若全局表未找到,压入nil

    ----------------------------------------------------------------------------------------------------------

    3lua_setglobal(L, key)

    参数

    L:虚拟机

    key:宿主程序想要获取的变量的名称

    返回

    void

    执行流程:

    :宿主会将名称key置于栈的顶部

    lua取得这个key后,作为一个全局变量名,并到lua的全局表中查找这个key对应的value

    :若全局表找到对应的value,将这个值压入栈顶(宿主程序可以取用);若全局表未找到,压入nil

    ----------------------------------------------------------------------------------------------------------

    4lua_settop(L, idx)

    参数解释

    L:虚拟机

    idx:将栈指针移动到指定的索引位置,例如lua_settop(L, 0)常用来重置栈,这样我们入栈的第一个信息就在idx=1的位置了

    -----------------------------------------------------------------------------------------------------------

    5lua_setfield(L, t_idx, key)

    参数解释:

    L:虚拟机

    t_idx:表在L栈中的索引

    key:待设置键名称

    返回:

    void

    执行细节:

    :取栈顶val

    :根据t_idx的值,找到对应的表t,做 t[key]=val的操作;

    :弹出栈顶val

    ------------------------------------------------------------------------------------------------------------

    6lua_getfield(L, t_idx, key)

    参数解释:

    L:虚拟机

    t_idx:表在L栈中的索引

    key:待取值的键名称

    返回:

    void

    执行细节:

    :根据t_idx的值,找到对应的表t,取 val = t[key]

    :将val压入栈顶

    ------------------------------------------------------------------------------------------------------------

    7 luaL_Reg

    解释:

    typedef struct luaL_Reg {

      const char *name;  // lua中函数的名称

      lua_CFunction func;  // 指向C中函数的函数指针

    } luaL_Reg;

    一个数组的类型,该数组会包含一些函数,这些函数会通过 luaL_setfuncs ()函数被注册,

    每一个luaL_Reg数组都必须用{NULL, NULL}来作为结尾的元素;

    ------------------------------------------------------------------------------------------------------------

    8 lua_createtable(L, narr, nrec)

    参数解释:

    L:虚拟机

    narrTable中数组部分预分配元素数量

    nrecTable中哈希部分预分配元素数量

    返回:

    void

    执行细节:

    :创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素

    :将table压入栈顶

    ------------------------------------------------------------------------------------------------------------

    9  luaL_setfuncs(L, narr, nrec)

    参数解释:

    L:虚拟机

    narrTable中数组部分预分配元素数量

    nrecTable中哈希部分预分配元素数量

    返回:

    void

    执行细节:

    :创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素

    :将table压入栈顶

    ------------------------------------------------------------------------------------------------------------

     

    10  lua_pushcclosure(lua_State *L, lua_CFunction fn, int n)

     

    参数解释:

    L:虚拟机

    fnc函数

    nc函数关联的upvalues个数

    返回:

    void

    执行细节:

    :创建和压入一个C闭包到栈顶

    :关联nupvalues到这个C闭包,首先这些upvalue必须被压入栈中

    :该函数调用结束后会弹出上面入栈的upvalue值,闭包不会被弹出;

    ------------------------------------------------------------------------------------------------------------

    11  luaL_setfuncs(L, narr, nrec)

    参数解释:

    L:虚拟机

    narrTable中数组部分预分配元素数量

    nrecTable中哈希部分预分配元素数量

    返回:

    void

    执行细节:

    :创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素

    :将table压入栈顶

    ------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    Linux下使用Eclipse 远程调试
    关于Mysql分区和分表
    Mysql点滴
    父窗口与iFrame之间调用方法和元素
    pl/sql developer安装使用即时客户端
    Java的四大基础特性
    Get与Post的小知识
    ibatis 中 $与#的区别
    Eclipse安装配置Maven
    Git学习
  • 原文地址:https://www.cnblogs.com/skiing886/p/7642530.html
Copyright © 2011-2022 走看看