前提设置:
源代码:
// InvokeLua.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string.h>
#include <iostream>
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#pragma comment(lib,"lua5.1.lib")
using namespace std;
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;
}
void load (lua_State *L,int *width,int *height)
{
lua_getglobal(L,"width"); //获得Lua中变量的值,将其入栈。Test.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); //将栈顶元素转化为数字
*height = (int)lua_tonumber(L,-1);
}
int add(lua_State *L,int a, int b){
int sum=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,"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));
}
sum = (int)lua_tonumber(L,-1); //取栈顶元素将其转为数字,默认为double型
lua_pop(L,1) ; //将return元素移除
return sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L = lua_open(); /* opens Lua */
luaL_openlibs(L); //新版本库添加的方法
if(luaL_loadfile(L,"Test.lua") || lua_pcall(L,0,0,0))
{
luaL_error(L,"loadfile error! %s \n",lua_tostring(L,-1));
}
int w,h;
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='a';
while(flag)
{
printf("Do you want to roll the number? \n");
//scanf("%c",&c);
std::cin>>c;
if(c =='y' ||c=='Y')
{
printf("rolling the number....\n the num is %d \n",get_num(L));
}
else
{
flag=false;
printf("Error");
}
}
getchar();
return 0;
}
--Test.lua
width = 200
height = 500
function add(a,b)
return a+b
end
math.randomseed(os.time())
function roll_num()
return math.random(6)
end