一.?? lua调用C++
?? ? ?在lua中是以函数指针的形式调用函数,并且所有的函数指针都必须满足如下此种类型: typedef int (*lua_CFunction) (lua_State *L); 也就是说,偶们在C++中定义函数时必须以lua_State为参数,以int为返回值才能被Lua所调用. 但是不要忘记了,偶们的lua_State是支持栈的,所以通过栈可以传递无穷个参数,大小只受内存大小限制. 而返回的int值也只是指返回值的个数真正的返回值都存储在lua_State的栈中. 偶们通常的做法是做一个wrapper,把所有需要调用的函数都wrap一下,这样就可以调用任意的函数了.
- #include<iostream>??
- using?namespace?std;??
- #include<stdio.h>??
- extern?"C"?{??
- #include?<lua.h>??
- #include?<lualib.h>??
- #include?<lauxlib.h>??
- }??
- ??
- lua_State*?L;??
- static?int?average(lua_State?*L)??
- {??
- ??????
- ????int?n?=?lua_gettop(L);??
- ????double?sum?=?0;??
- int?i;??
- ????for?(i?=?1;?i?<=?n;?i++)??
- ????{??
- ????????if?(!lua_isnumber(L,?i))???
- ????????{??
- ????????????lua_pushstring(L,?"Incorrect?argument?to?'average'");??
- ????????????lua_error(L);??
- ????????}??
- ????????sum?+=?lua_tonumber(L,?i);??
- ????}??
- ??????
- ????lua_pushnumber(L,?sum?/?n);??
- /*?push?the?sum?*/??
- ??????
- /*?return?the?number?of?results?*/??
- ????return?2;??
- }??
- int?main?(int?argc,char*argv[])??
- {??
- /*?initialize?Lua?*/??
- ????L?=?lua_open();??
- /*?load?Lua?libraries?*/??
- ????luaL_openlibs(L);??
- /*?register?our?function?*/??
- ????lua_register(L,?"average",?average);??
- /*?run?the?script?*/??
- ????luaL_dofile(L,?"e15.lua");??
- ????lua_getglobal(L,"avg");??
- ????cout<<"avg?is:"<<lua_tointeger(L,-1)<<endl;??
- ????lua_pop(L,1);??
- ????lua_getglobal(L,"sum");??
- ????cout<<"sum?is:"<<lua_tointeger(L,-1)<<endl;??
- /*?cleanup?Lua?*/??
- ????lua_close(L);??
- return?0;??
- //程序??
- ??
- //?所以栈顶元素的序号也相当于栈中的元素个数.?在这里,?栈中元素的个数就??
- //?是传入的参数个数.??
- //*?for循环计算所有传入参数的总和.?这里用到了数值转换lua_tonumber().??
- //*?然后偶们用lua_pushnumber()把平均值和总和push到栈中.??
- //*?最后,?偶们返回2,?表示有两个返回值.??
- //*?虽然在C++中定义了average()函数,?但Lua程序并不知道,?所以需??
- //??要在main函数中加入??
- //?????//?register?our?function???
- //??lua_register(L,?"average",?average);??
- // 这两行的作用就是告诉e15.lua有average()这样一个函数.??
- //*?这个程序可以存成cpp也可以存成c,?如果以.c为扩展名就不需要加extern?"C"??
- //??? ??
- //编译的方法偶们上次说过了,?方法相同.??
- //e15.lua执行的方法只能用上例中的C++中执行,?而不能用命令行方式执行.*/??
脚本为
?
avg,sum = average(10,20,30,40,50)
print("The average is ",avg)
print("The sum is ",sum)
二.? C++调用lua
#include?"stdafx.h"??
- #include?<stdio.h>??
- extern?"C"?{??
- #include?"lua.h"??
- #include?"lualib.h"??
- #include?"lauxlib.h"??
- /*?Lua解释器指针?*/??
- lua_State*?L;??
- int?main?(?char?*argv[]?)??
- /*?初始化Lua?*/??
- /*?载入Lua基本库?*/??
- /*?运行脚本?*/??
- "Lua1.lua");??
- /*?清除Lua?*/??
- /*?暂停?*/??
- ????printf(?"Press?enter?to?exit…"?);??
- ????getchar();??
- }??
copy
/*?A?simple?Lua?interpreter.?*/???
- #include?<stdio.h>???
- #include?<lua.h>???
- #include?<lualib.h>??
- #include?<lauxlib.h>??
- extern?"C"?{???
- //?因为lua的头文件都是C格式的??
- #include?"lua.h"??
- #include?"lualib.h"??
- #include?"lauxlib.h"??
- #pragma?comment(lib,0); background-color:inherit">/*?the?Lua?interpreter?*/??
- int?luaadd?(?int?x,87); background-color:inherit; font-weight:bold">int?y?)??
- int?sum;??
- /*?the?function?name?*/??
- "add");????????int?nTop?=?lua_gettop(L);???
- /*?the?first?argument?*/??
- ????lua_pushnumber(L,?x);???????????nTop?=?lua_gettop(L);??
- /*?the?second?argument?*/??
- /*?call?the?function?with?2?
- ????arguments,?return?1?result?*/??
- ????lua_call(L,?2,?1);??????????????nTop?=?lua_gettop(L);??
- /*?get?the?result?*/??
- ????sum?=?(int)lua_tonumber(L,?-1);?nTop?=?lua_gettop(L);??
- /*清掉返回值*/??
- /*取出脚本中的变量z的值*/??
- "z");??????????nTop?=?lua_gettop(L);??
- int?z?=?(//没调通??
- /*lua_pushnumber(L,?4);?????????nTop?=?lua_gettop(L);?
- ????lua_setglobal(L,?"r");??????????nTop?=?lua_gettop(L);?
- ????int?r?=?(int)lua_tonumber(L,?1);nTop?=?lua_gettop(L);*/??
- return?sum;??
- char?*argv[]?)??
- int?sum;??
- /*?load?Lua?base?libraries?*/??
- //lua_baselibopen(L);??
- /*?load?the?script?*/??
- "e12.lua");??
- /*?call?the?add?function?*/??
- ????sum?=?luaadd(?10,?15?);??
- /*?print?the?result?*/??
- ????printf(?"The?sum?is?%d",?sum?);??
- return?0;??
- /*程序说明:?
- main中过程偶们上次已经说过了,?所以这次只说说luaadd的过程?
- *?首先用lua_getglobal()把add函数压栈?
- *?然后用lua_pushnumber()依次把x,y压栈?
- *?然后调用lua_call(),?并且告诉程序偶们有两个参数一个返回值?
- *?接着偶们从栈顶取回返回值,?用lua_tonumber()?
- *?最后偶们用lua_pop()把返回值清掉?
- */??
?
脚本为:
-- add two numbers
function add ( x,y )
return x + y + 2
end
z = 6
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|