废话就不多说了,直接进入正题.首先我们的LUA文件Test.lua看起来像是下面这样的:
T1={1,2,3,4,5,6,7,8,9}
T2={A="A",B="B",C="C",1,3,5}
----------------------------
function Factorial(n)
if n == 0 then
return 1
else
return n*Factorial(n-1)
end
end
然后我们的C代码看起来应该是下面这样.其中注释已经写在代码中就不在啰嗦了.稍稍查下资料就应该明白.
#ifdef __cplusplus
extern "C"
{
#endif
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#ifdef __cplusplus
}
#endif
#include<iostream>
int main(int argc, char* argv[])
{
lua_State* L=luaL_newstate();
luaL_openlibs(L);
if (luaL_dofile(L,"Test.lua")!=0)
std::cout<<"LOAD LUA FILE ERROR"<<std::endl;
int nTop=lua_gettop(L);
lua_getglobal(L,"T1");//全局表T1入栈
size_t i=1 ;
while(i<=lua_objlen(L,-1))
{
lua_rawgeti(L,-1,i++);//获取T1中第i个元素的值
std::cout<<lua_tointeger(L,-1)<<" ";
lua_pop(L,1);
}
lua_getglobal(L,"T2");//全局表T2入栈
lua_getfield(L,-1,"A");//获取标准Key="A"的Value
std::cout<<"\nT[\"A\"]="<<lua_tostring(L,-1)<<std::endl;
lua_pop(L,1);
lua_pushnil(L);
while(lua_next(L,-2))
{
lua_pushvalue(L,-2);//复制一份Key,因为lua_tostring会将栈中的key也转化为String影响下一次遍历
std::cout<<lua_tostring(L,-2)<<":"<<lua_tostring(L,-1)<<std::endl;
lua_pop(L,2);//把栈顶的值移出栈,让key成为栈顶以便继续遍历
}
lua_getglobal(L,"Factorial");//把Factorial函数放入栈中
lua_pushnumber(L,5);//将Factorial函数需要的参数压栈
lua_call(L,1,1);//调用函数.第二个参数表示函数的参数个数.第三个参数表示函数返回值的个数
std::cout<<lua_tonumber(L,-1)<<std::endl;
lua_settop(L,nTop);
return 0;
}