在c中调用lua函数,获取返回值等
偶们这次主要说说怎么由Lua定义函数, 然后在C或者C++中调用. 这里偶们暂不涉及C++的对象问题, 只讨论调用函数的参数, 返回值和全局变量的使用.
2.
这里偶们在e12.lua里先定义一个简单的add(), x,y为加法的两个参数,return 直接返回相加后的结果.
例e12.lua
-- add two numbers function add ( x, y ) return x + y end
在前一次里, 偶们说到 lua_dofile() 可以直接在C中执行lua文件. 因为偶们这个程序里只定义了一个add()函数, 所以程序执行后并不直接结果, 效果相当于在C中定义了一个函数一样.
Lua的函数可以有多个参数, 也可以有多个返回值, 这都是由栈(stack)实现的.需要调用一个函数时, 就把这个函数压入栈, 然后顺序压入所有参数, 然后用lua_call()调用这个函数. 函数返回后, 返回值也是存放在栈中. 这个过程和汇编执行函数调用的过程是一样的.
例e13.cpp 是一个调用上面的Lua函数的例子
#include extern " C " { // 这是个C++程序, 所以要extern "C", // 因为lua的头文件都是C格式的 #include " lua.h " #include " lualib.h " #include " lauxlib.h " } /* the Lua interpreter */ lua_State * L; int luaadd ( int x, int y ) { int sum; /* the function name */ lua_getglobal(L, " add " ); /* the first argument */ lua_pushnumber(L, x); /* the second argument */ lua_pushnumber(L, y); /* call the function with 2 arguments, return 1 result */ lua_call(L, 2 , 1 ); /* get the result */ sum = ( int )lua_tonumber(L, - 1 ); lua_pop(L, 1 ); return sum; } int main ( int argc, char * argv[] ) { int sum; /* initialize Lua */ L = lua_open(); /* load Lua base libraries */ lua_baselibopen(L); /* load the script */ lua_dofile(L, " e12.lua " ); /* call the add function */ sum = luaadd( 10 , 15 ); /* print the result */ printf( " The sum is %d\n " , sum ); /* cleanup Lua */ lua_close(L); return 0 ; }
程序说明:
main中过程偶们上次已经说过了, 所以这次只说说luaadd的过程
* 首先用lua_getglobal()把add函数压栈
* 然后用lua_pushnumber()依次把x,y压栈
* 然后调用lua_call(), 并且告诉程序偶们有两个参数一个返回值
* 接着偶们从栈顶取回返回值, 用lua_tonumber()
* 最后偶们用lua_pop()把返回值清掉
运行结果:
The sum is 25
编译方法
Linux下把程序存成e13.cpp
g++ e13.cpp -llua -llualib -o e13
./e13
VC下编译方法
* 首先建立一个空的Win32 Console Application Project
* 把e13.cpp加入工程中
* 点project setting,然后设置link选项, 再加上lua.lib lualib.lib两个额外的库
* 最后编译
建立好的project可以在这里下载
VC http://tonyandpaige.com/tutorials/luaadd.zip
Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz
3.全局变量
上面偶们用到了lua_getglobal()但并没有详细讲, 这里偶们再举两个小例子来说下全局变量
lua_getglobal()的作用就是把lua中全局变量的值压入栈
lua_getglobal(L, "z");
z = (int)lua_tonumber(L, -1);(ps:将栈顶元素转为int)
lua_pop(L, 1);
假设Lua程序中定义了一个全局变量z, 这段小程序就是把z的值取出放入C的变量z中.
另外Lua中还有一个对应的函数lua_setglobal(), 作用是用栈顶的值填充指定的全局变量
lua_pushnumber(L, 10);(ps:pushnumber往栈中推进一个变量,使用setglobal设置lua中全局变量z)
lua_setglobal(L, "z");
例如这段小程序就是把lua中的全局变量z设为10, 如果lua中未定义z的话, 就会自动创建一个
全局变量z并设为10.
4.试试看
自己写个函数用C/C++来调用下试试
===================================================================
ps:
lua 函数只有一个返回值的情况:
假设返回值的类型是整型,用lua_tonumber 获取返回值:
z = lua_tonumber(L, -1); -- 这里的-1 表示栈顶
然后清栈:
lua_pop(L, 1); /* pop returned value */
lua 函数有多个返回值的情况:
LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc)
函数中有一个指定返回值个数的,你需要指定,比如:
lua_pcall(lua, 2, 3, 0)表示两个输入参数,3个返回值。
如果有多个返回值,第一个返回值会先压栈。例如有三个返回值,第一个在栈中的索引是-3,最后一个-1。
z1 = lua_tonumber(L, -3);
z2 = lua_tonumber(L, -2);
z3 = lua_tonumber(L, -1);
转载自:http://blog.csdn.net/cws1214/article/details/15812191
文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。
原文链接:gamwatcher.blog.csdn.net/article/details/19157789
- 点赞
- 收藏
- 关注作者
评论(0)