Lua是腳本語(yǔ)言,最大的優(yōu)勢(shì)就是輕巧靈便,不用編譯。當(dāng)C的框架寫(xiě)好,只要更改lua的相應(yīng)處理即可以更改功能,并且不用重新編譯。以下是在C中調(diào)用Lua資源方法的示例程序:
C++端:
// Lua1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#includestdio.h>
extern "C" { //如不用extern會(huì)出現(xiàn)連接錯(cuò)誤,編譯成了C++文件
#include lua.h>
#include lualib.h>
#include lauxlib.h>
}
void load (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' should be a number\n");
if(!lua_isnumber(L,-1))
luaL_error(L,"`height' should be a number\n");
*width = (int)lua_tonumber(L,-2); //將棧頂元素轉(zhuǎn)化為數(shù)字
*height = (int)lua_tonumber(L,-1);
}
int add(lua_State *L,int a, int b){
int sum=0;
lua_getglobal(L,"add"); //函數(shù)也是變量,所以一個(gè)取法
lua_pushnumber(L,a); //將變量傳入
lua_pushnumber(L,b);
//第二個(gè)參數(shù)為調(diào)用函數(shù)的參數(shù)的個(gè)數(shù),第三個(gè)為返回值的個(gè)數(shù),第四個(gè)參數(shù)是錯(cuò)誤處理函數(shù),正常運(yùn)行返回0
if(lua_pcall(L,2,1,0) != 0){
luaL_error(L,"the lua load error! %s",lua_tostring(L,-1));
}
//函數(shù)的返回值已經(jīng)傳入棧中
if(!lua_isnumber(L,-1)){
luaL_error(L,"the func run error! %s",lua_tostring(L,-1));
}
sum = (int)lua_tonumber(L,-1); //取棧頂元素將其轉(zhuǎn)為數(shù)字,默認(rèn)為double型
lua_pop(L,1) //將return元素移除
return sum;
}
int get_num(lua_State *L){
lua_getglobal(L,"roll_num");
if(lua_pcall(L,0,1,0) != 0){
luaL_error(L,"the lua load error! %s",lua_tostring(L,-1));
}
if(!lua_isnumber(L,-1)){
luaL_error(L,"the func run error! %s",lua_tostring(L,-1));
}
int n = (int)lua_tonumber(L,-1);
lua_pop(L,1);
return n;
}
int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L = lua_open();
luaL_openlibs(L); //新版本庫(kù)添加的方法
if(luaL_loadfile(L,"cof.lua") || lua_pcall(L,0,0,0)){
luaL_error(L,"loadfile error! %s \n",lua_tostring(L,-1));
}
int w=1,h=2;
int sum;
load(L,w,h);
printf("width is %d ,height is %d\n",w,h);
sum=add(L,w,h);
printf("the sum is: %d \n",sum);
bool flag = true;
char c;
while(flag){
printf("Do you want to roll the number? \n");
scanf("%c",c);
if(c == 'y' || c=='Y'){
printf("rolling the number....\n the num is %d \n",get_num(L));
}
else flag=false;
getchar();
}
getchar();
return 0;
}