C++中调用Lua配置文件和响应函数示例
Lua是脚本语言,最大的优势就是轻巧灵便,不用编译。当C的框架写好,只要更改lua的相应处理即可以更改功能,并且不用重新编译。以下是在C中调用Lua资源方法的示例程序:
C++端:
//Lua1.cpp:定义控制台应用程序的入口点。 // #include"stdafx.h" #include<stdio.h> extern"C"{//如不用extern会出现连接错误,编译成了C++文件 #include<lua.h> #include<lualib.h> #include<lauxlib.h> } voidload(lua_State*L,int*width,int*height){ lua_getglobal(L,"width");//获得Lua中变量的值,将其放入栈中 lua_getglobal(L,"height"); if(!lua_isnumber(L,-2))//栈顶为-1,然后依次减少 luaL_error(L,"`width'shouldbeanumber\n"); if(!lua_isnumber(L,-1)) luaL_error(L,"`height'shouldbeanumber\n"); *width=(int)lua_tonumber(L,-2);//将栈顶元素转化为数字 *height=(int)lua_tonumber(L,-1); } intadd(lua_State*L,inta,intb){ intsum=0; lua_getglobal(L,"add");//函数也是变量,所以一个取法 lua_pushnumber(L,a);//将变量传入 lua_pushnumber(L,b); //第二个参数为调用函数的参数的个数,第三个为返回值的个数,第四个参数是错误处理函数,正常运行返回0 if(lua_pcall(L,2,1,0)!=0){ luaL_error(L,"thelualoaderror!%s",lua_tostring(L,-1)); } //函数的返回值已经传入栈中 if(!lua_isnumber(L,-1)){ luaL_error(L,"thefuncrunerror!%s",lua_tostring(L,-1)); } sum=(int)lua_tonumber(L,-1);//取栈顶元素将其转为数字,默认为double型 lua_pop(L,1)//将return元素移除 returnsum; } intget_num(lua_State*L){ lua_getglobal(L,"roll_num"); if(lua_pcall(L,0,1,0)!=0){ luaL_error(L,"thelualoaderror!%s",lua_tostring(L,-1)); } if(!lua_isnumber(L,-1)){ luaL_error(L,"thefuncrunerror!%s",lua_tostring(L,-1)); } intn=(int)lua_tonumber(L,-1); lua_pop(L,1); returnn; } int_tmain(intargc,_TCHAR*argv[]) { lua_State*L=lua_open(); luaL_openlibs(L);//新版本库添加的方法 if(luaL_loadfile(L,"cof.lua")||lua_pcall(L,0,0,0)){ luaL_error(L,"loadfileerror!%s\n",lua_tostring(L,-1)); } intw=1,h=2; intsum; load(L,&w,&h); printf("widthis%d,heightis%d\n",w,h); sum=add(L,w,h); printf("thesumis:%d\n",sum); boolflag=true; charc; while(flag){ printf("Doyouwanttorollthenumber?\n"); scanf("%c",&c); if(c=='y'||c=='Y'){ printf("rollingthenumber....\nthenumis%d\n",get_num(L)); } elseflag=false; getchar(); } getchar(); return0; }
Lua文件:
--configtest width=200 height=500 functionadd(a,b) returna+b end math.randomseed(os.time()) functionroll_num() returnmath.random(6) end