从Lua调用C
来源:互联网 发布:易语言cc攻击源码 编辑:程序博客网 时间:2024/06/05 03:58
从Lua调用C:
方式:C函数从栈中获取函数参数(第一个参数总是局部栈的索引1),将结果压入栈中,C函数需要返回结果数量。每个函数都有自己的局部私有栈
注册函数到Lua:
1、函数的原型: typedef int(*lua_CFunction)(lua_State *L)
在函数返回之前,Lua会自动删除栈中结果之下的内容
2、使用lua_pushcfunction(L,func)
lua_setglobal(L,"mysin")
3、参数类型检查:将lua_tonumber(L,1)改成luaL_checknumber(L,1)
注册函数模块:
luaL_register:这个函数接收一些C函数及其名称,并将这些函数注册到一个与模块同名的table中。
数组操作:
void lua_rawgeti(lua_State* L,int index,int key)
void lua_rawset(L,index,key)
lua_rawgeti(L,t,key)等价于:
lua_pushnumber(L,key)
lua_rawget(L,t)
lua_rawget类似于lua_gettable,区别在于raw可以绕过元表的index
lua_rawseti(L,t,key)等价于:
lua_pushnumber(L,key)
lua_insert(L,-2) //将'key'放到前一个值的下面:因为rawset的规则是key在下面value在栈顶
lua_rawset(L,t)
这两个函数都是raw操作,比涉及元表的table访问更快。
示例:
方式:C函数从栈中获取函数参数(第一个参数总是局部栈的索引1),将结果压入栈中,C函数需要返回结果数量。每个函数都有自己的局部私有栈
例子:static int l_sin(lua_State *L){double d = lua_tonumber(L,1);//获取参数,索引为1(私有栈)lua_pushnumber(L,sin(d));//压入结果return 1;//返回结果的数量}
注册函数到Lua:
1、函数的原型: typedef int(*lua_CFunction)(lua_State *L)
在函数返回之前,Lua会自动删除栈中结果之下的内容
2、使用lua_pushcfunction(L,func)
lua_setglobal(L,"mysin")
3、参数类型检查:将lua_tonumber(L,1)改成luaL_checknumber(L,1)
注册函数模块:
luaL_register:这个函数接收一些C函数及其名称,并将这些函数注册到一个与模块同名的table中。
例子:C:static const struct luaL_Reg mylib[] = {{"dir",l_dir},{NULL,NULL}//结尾}luaL_register(L,"mylib",mylib);Lua:require "mylib"print("mylib.mysin(10)",mylib.mysin(10))
数组操作:
void lua_rawgeti(lua_State* L,int index,int key)
void lua_rawset(L,index,key)
lua_rawgeti(L,t,key)等价于:
lua_pushnumber(L,key)
lua_rawget(L,t)
lua_rawget类似于lua_gettable,区别在于raw可以绕过元表的index
lua_rawseti(L,t,key)等价于:
lua_pushnumber(L,key)
lua_insert(L,-2) //将'key'放到前一个值的下面:因为rawset的规则是key在下面value在栈顶
lua_rawset(L,t)
这两个函数都是raw操作,比涉及元表的table访问更快。
示例:
int l_map(lua_State *L){int i,n;luaL_checktype(L,1,LUA_TTABLE);//第一个参数必须是一个tableluaL_checktype(L,2,LUA_TFUNCTION);//第二个参数必须是一个函数n = lua_objlen(L,1);//获取table大小for(int i=1;i<=n;i++){lua_pushvalue(L,2);//压入flua_rawgeti(L,1,i);//压入t[i]lua_call(L,1,1);//调用f(t[i])lua_rawseti(L,1,i);//t[i] = 结果,***rawseti设置后会清除栈顶的返回值}return 0;}
1 0
- 从C调用Lua
- 从Lua调用C
- 从lua调用C函数
- 第二十六课 从Lua调用C
- Lua学习笔记三之从Lua中调用C
- [Lua]C/C++调用Lua
- [lua]C调用lua函数
- 快速掌握Lua 5.3 —— 从Lua中调用C函数
- C/C++ 调用 Lua
- c调用lua脚本
- Lua调用C函数
- C调用lua
- lua 调用c函数
- lua c/c++ 调用
- Lua调用C函数
- lua调用c函数
- Lua调用C函数
- c调用lua
- 各种tabLayout
- C#语法笔记
- Codeforces Round #315 (Div. 2) C. Primes or Palindromes?
- 算法竞赛入门经典:第五章 基础题目选解 5.3 周期串
- 开源中国源码学习(六)——ButterKnife的使用
- 从Lua调用C
- 算法竞赛入门经典:第五章 基础题目选解 5.4 小学生算术
- NGUI研究院之UISprite和UITexture浅谈(十二)(图片大小优化)
- GCD的使用与理解(2)
- double-array-trie双数组trie树原理解析和数据构建过程
- JAVA编程之static、final修饰符
- Linux图形界面与字符界面切换
- 算法竞赛入门经典:第五章 基础题目选解 5.5 高精度乘法
- 最长公共子序列(动态规划)