C++与Lua交互(二)
2012-10-30 23:04
323 查看
C++与Lua的之间函数的相互调用
1.C++调Lua函数
C与lua的所有交互都是通过一个栈来完成的。我对前面提到的虚拟机L的理解是,它就是一个栈(可能理解的不对)。然后通过对这个栈的操作来实现数据的交互。
调用函数跟访问变量其实差不多,前面都是做一样的事,只是调用函数时获取的变量是函数名。然后将需要的参数逐一入栈,最好通过lua_call来调用函数。具体实现如下。
********test.lua*************
function add(x,y)
return x+y
end
******************************
int main(int argc,char *argv[])
{
int ret;
int x = 1;
int y = 2;
lua_State *L = lua_open();
luaL_openlibs(L);
luaL_dofile(L);
lua_getglobal(L,"add"); //将函数入栈
lua_pushnumber(L,x); //变量x入栈
lua_pushnumber(L,y); //变量y入栈
lua_call(L,2,1) //2表示参数个数,1表示函数返回值的个数。因为lua可以返回多个值。 我的理解是将x,y出栈,计算函数值,并将函数值入栈。这时,函数值就在栈顶。
ret = lua_tonumber(L,-1) //获取栈顶元素,并出栈。-1表示对栈顶的偏移量为1。负数时对栈顶的偏移量,正数是对栈底的偏移量。如果返回的是字符串就用lua_tostring。
lua_pop(L,1); //将函数出栈
lua_close(L);
return 0;
}
2.Lua调C++函数
lua要调用C的函数需要将C函数注册到lua中。
int add(lua_State *L)
{
double sum = 0;
sum = lua_tonumber(L,-1) + lua_tonumber(L,-2); //取栈顶两元素,并相加
lua_pushnumber(L,sum); //将结果返回给lua
return 0;
}
int main(int argc,char *argv[])
{
lua_State *L = lua_open();
luaL_openlibs(L);
lua_register(L,"_add",add); //向lua注册C函数,第二个参数是lua中的函数名,第三个参数是C的函数名。
luaL_dofile(L,"luaandc.lua"); //执行lua文件
return 0;
}
1.C++调Lua函数
C与lua的所有交互都是通过一个栈来完成的。我对前面提到的虚拟机L的理解是,它就是一个栈(可能理解的不对)。然后通过对这个栈的操作来实现数据的交互。
调用函数跟访问变量其实差不多,前面都是做一样的事,只是调用函数时获取的变量是函数名。然后将需要的参数逐一入栈,最好通过lua_call来调用函数。具体实现如下。
********test.lua*************
function add(x,y)
return x+y
end
******************************
int main(int argc,char *argv[])
{
int ret;
int x = 1;
int y = 2;
lua_State *L = lua_open();
luaL_openlibs(L);
luaL_dofile(L);
lua_getglobal(L,"add"); //将函数入栈
lua_pushnumber(L,x); //变量x入栈
lua_pushnumber(L,y); //变量y入栈
lua_call(L,2,1) //2表示参数个数,1表示函数返回值的个数。因为lua可以返回多个值。 我的理解是将x,y出栈,计算函数值,并将函数值入栈。这时,函数值就在栈顶。
ret = lua_tonumber(L,-1) //获取栈顶元素,并出栈。-1表示对栈顶的偏移量为1。负数时对栈顶的偏移量,正数是对栈底的偏移量。如果返回的是字符串就用lua_tostring。
lua_pop(L,1); //将函数出栈
lua_close(L);
return 0;
}
2.Lua调C++函数
lua要调用C的函数需要将C函数注册到lua中。
int add(lua_State *L)
{
double sum = 0;
sum = lua_tonumber(L,-1) + lua_tonumber(L,-2); //取栈顶两元素,并相加
lua_pushnumber(L,sum); //将结果返回给lua
return 0;
}
int main(int argc,char *argv[])
{
lua_State *L = lua_open();
luaL_openlibs(L);
lua_register(L,"_add",add); //向lua注册C函数,第二个参数是lua中的函数名,第三个参数是C的函数名。
luaL_dofile(L,"luaandc.lua"); //执行lua文件
return 0;
}
相关文章推荐
- lua与C/C++的交互
- C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
- Lua和C++交互详细总结
- cocos2d-x学习笔记(十一)c++与lua交互回调函数的处理
- VS 2013 编译Lua源码,并与C++ 进行简单交互
- C/C++与Lua交互(C实现的Lua编译器的例子)
- Lua与C/C++的交互3:C/C++中读取Lua文件中的表
- Lua和C++交互 学习记录之五:全局数组交互
- Lua和C++交互 学习记录之六:全局函数交互
- [lua] 使用lua string作为二进制buffer和c/c++交互
- Lua和C++交互详细总结
- Lua与C/C++的交互6:Lua调用C/C++函数
- Lua与c/c++交互
- (使用lua++)Lua脚本和C++交互(三)
- C++与Lua交互(五)
- C++ 和lua交互学习的三个例子
- Lua和C++交互总结(很详细)
- Lua和C++交互总结(很详细)
- Lua与C/C++的交互
- vs配置Lua环境 Lua与C++交互