C调用lua

1、Lua六个常用库

math-数学库

table-表库

string-字符串处理库

io-io库

os-系统库

debug-调试库

用法很简单,如:os.date("*t",os.time())--获取格式化的时间,os.time()相当于C中time(0),可以下个LuaStudio输入库直接可看出相关函数。

2、C与Lua调用

    //创建新环境,多线程模式下,如果需要独立可创建多个环境

lua_State* pLua = luaL_newstate(); 

    //打开常用的六大库,就上面说的,当然你不想用某些库,也可以打开指定的一些会用到的库luaopen_math,luaopen_string...等

luaL_openlibs(pLua);

    //load and call lua file,加载编译并执行lua文件 

    if(luaL_dofile(pLua, "test.lua"))

    {

        fprintf(stderr, "dofile lua file error!\n");

        lua_pop(m_pLua,1);

    }

    //注册供lua调用的函数组

static const luaL_Reg funcs[] =
{
"RegAssignTimer", RegAssignTimer
};

    //game可以理解为供lua调用C的函数库
luaL_register(m_pLua,"game",funcs);

   插段lua

--file test.lua

function main()

    RegAssignTimer(os.time() + 10, "ShowInfo")

end

function ShowInfo()

    print("HelloWorld,It's lua")

end

好了上面就是我们写的例子,lua注册一个指定时间的定时器,C来提供这个定时效果,再回调lua中的ShowInfo函数

int RegAssignTimer(lua_State* L)

{

    time_t uTime = lua_tonumber(L, 1); //栈底开始取参数

    char* pszFuncName = lua_tostring(L, 2)

伪代码:将上面信息方法定时调用机制中(指定时间定时器实现,这个不是我们要讨论的重点)

return 1;

}

我们假设时间到了10s过了,怎么调用这个ShowInfo

void ExcuteLuaFunc(const char* pszLuaFunc)

{

lua_getgloabal(pLua, pszLuaFunc); //从lua中获取函数地址

lua_pcall(pLua, 0, 0, 0);//第一个0是参数个数,第二个0是返回结果数

}

//讲到这,顺表提下常用的几个堆栈操作函数

lua_gettop();//获取栈顶的(正值)下标,即获取栈中元素个数

好第一个引入一个概念下标,在lua中栈底到栈顶方向称正方向,由1~n

相反由栈顶到栈底称负方向,-1 ~ -n

那么就简单理解了

lua_gettop为什么是获取栈中元素个数了,获取栈顶元素下标值(正方向)即是最大的,所以也就是此栈的元素数量

同理

lua_settop(pLua, 0); //设置栈顶下标,设置为0,即清空了栈元素

lua_settop(pLua, -(n)-1); //这个一眼看感觉难理解点,也就是lua_pop()宏的实现

表示从栈顶要弹出元素的数量。lua_pop(pLua, 1)<==>lua_settop(pLua, -2); 将栈顶设置为-2,

(注:负方向下标不能和正方向下标直接+-换算)-1是大于-2的,所以-1位置元素被移除,也就是弹出栈顶元素的效果。

向栈中压入数据lua_pushXXX系列自己可以查。

lua_newtable

lua_getglobal

lua_setglobal

lua_gettable

lua_rawgeti

后面有时间补充笔记。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值