lua 语言非常灵活,一般把lua 作为脚本文件,会用C++与之进行交互。最重要的是C++代码能读取到脚本中的变量、一维表、二维表。
这样有些参数就可以在lua文件进行更改,而不用重新更改C++代码、又得重新编译、运行。
lua 文件 (test.lua )中的内容如下
- -- ship include name width height
- yValue = 60
- myStr = "guoyilongedu"
- --one
- cfg = {name = "test123" ,rotation = 180 , width = 123}
- myShip = {}
- for indx = 1,10 do
- local mystring = string.format("%s%d","id",indx)
- myShip[indx] = {}
- myShip[indx].name = mystring
- myShip[indx].width = 140
- myShip[indx].height =100
- end
- for index = 1,table.getn(myShip) do
- print(index,myShip[index].name,myShip[index].width,myShip[index].height)
- end
- for index ,value in pairs(cfg) do
- print(index,value)
- end
- print(yValue);
如上面文件中的内容, yValue , myStr 就是lua 文件中的变量,cfg 是一维表 myShip 是二维表
- #include <stdio.h>
- extern "C"{
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- }
- /*Lua 解释器指针
- */
- int main ( int argc, char *argv[] ){
- lua_State* L;
- /*初始化Lua
- */
- L=lua_open();
- luaopen_base(L);
- luaopen_table(L);
- luaopen_string(L);
- luaopen_math(L);
- lua_pushcfunction(L,l_getarr);
- lua_setglobal(L,"getarr");
- /*运行脚本
- */
- if (luaL_dofile(L, "test.lua"))
- {
- printf("run script failed\n");
- }
- else
- {
- /* lua_getglobal(L,"result");
- if(lua_isnumber(L,-1))
- {
- printf("The result of the lua script is %d\n",lua_tonumber(L,-1));
- }
- */
- printf("输出变量\n");
- lua_getglobal(L,"yValue");
- if(lua_isnumber(L,-1))
- {
- printf("%s","ddddd\n");
- printf("%d",(int)lua_tointeger(L,-1));
- }
- lua_getglobal(L,"myStr");
- if(lua_isstring(L,-1))
- {
- printf("%s","\n");
- printf("%s\n",lua_tostring(L,-1));
- }
- /* 读取一维表
- */
- lua_getglobal(L,"cfg");
- if(lua_istable(L,-1))
- {
- lua_pushstring(L,"name");
- lua_gettable(L,-2);
- if(lua_isstring(L,-1))
- {
- printf("%s %s\n","name",lua_tostring(L,-1));
- }
- lua_pop(L,1);
- lua_pushstring(L,"rotation");
- lua_gettable(L,-2);
- if(lua_isnumber(L,-1))
- {
- printf("%s %d\n","rotation",(int)lua_tonumber(L,-1));
- }
- //清空栈
- lua_pop(L,2);
- }
- //用遍历的方式访问一维表
- lua_getglobal(L,"cfg");
- int t_idx=lua_gettop(L);
- lua_pushnil(L);
- printf("%s\n","用遍历的方式访问一维表");
- while(lua_next(L,t_idx)!=0)
- {
- // printf("%s %s\n",lua_typename(L,lua_type(L,-2)),lua_typename(L,lua_type(L,-1)));
- if(lua_isstring(L,-2))
- {
- printf("%s\n",lua_tostring(L,-2));
- }
- else if(lua_isnumber(L,-2))
- {
- printf("%d\n",(int)lua_tonumber(L,-2));
- }
- if(lua_isstring(L,-1))
- {
- printf("%s\n",lua_tostring(L,-1));
- }
- else if(lua_isnumber(L,-1))
- {
- printf("%d\n",(int)lua_tonumber(L,-1));
- }
- // printf("%s\n",lua_tostring(L,-2));
- // printf("%s\n",lua_tostring(L,-1));
- lua_pop(L,1);
- }
- //二维表的遍历
- printf("二维表的遍历\n");
- int it_idx;
- lua_getglobal(L,"myShip");
- t_idx=lua_gettop(L);
- lua_pushnil(L);
- while(lua_next(L,t_idx))
- {
- it_idx=lua_gettop(L);
- lua_pushnil(L);
- while(lua_next(L,it_idx))
- {
- printf("%s= ",lua_tostring(L,-2));
- printf("%s\n",lua_tostring(L,-1));
- lua_pop(L,1);
- }
- lua_pop(L,1);
- }
- /* while (lua_next(L,-1))
- {
- lua_pushvalue(L,-2);
- const char * key =lua_tostring(L,-1);
- const char * value = lua_tostring(L,-2);
- printf("%s => %s\n",key ,value);
- lua_pop(L,2);
- }*/
- }
- /*清除Lua
- */
- lua_close(L);
- return 0;
- }
输出变量
lua_getglobal(L,"yValue"); //得到变量
if(lua_isnumber(L,-1)) //如果是数字
{
printf("%s","ddddd\n");
printf("%d",(int)lua_tointeger(L,-1));
}
lua_getglobal(L,"myStr"); //得到变量
if(lua_isstring(L,-1)) //如果是字符串
{ printf("%s","\n");
printf("%s\n",lua_tostring(L,-1));
}
输出一维表
lua_getglobal(L,"cfg"); //得到一维表变量 cfg
if(lua_istable(L,-1)) //如果是table
{
lua_pushstring(L,"name"); //将key name 入栈
lua_gettable(L,-2); //table 就在-2的位置
if(lua_isstring(L,-1))
{
printf("%s %s\n","name",lua_tostring(L,-1));
}
lua_pop(L,1);
/*
Lua取元素的协议是:首先将一个字符串压栈,然后调用lua_gettable。
lua_gettable的实际的工作流程是:以栈顶的字符串(key)为关键字,在栈索引位置( -2)的表(table)中查询该关键字的值(value),然后将栈顶的key出栈,再将value压栈。
lua_pop( L, 1)的作用就是将这个返回值出栈,以保持栈的原貌
*/
lua_pushstring(L,"rotation");
lua_gettable(L,-2);
if(lua_isnumber(L,-1))
{
printf("%s %d\n","rotation",(int)lua_tonumber(L,-1));
}
//清空栈
lua_pop(L,2);
}
上面只是在知道key 的情况下,比较有用,当然也可以用遍历的方式来获取
lua_getglobal(L,"cfg"); //得到变量cfg
int t_idx=lua_gettop(L); //得 cfg 的长度
lua_pushnil(L); //往栈顶压入nil
printf("%s\n","用遍历的方式访问一维表");
while(lua_next(L,t_idx)!=0) // 开始遍历
{
if(lua_isstring(L,-2)) //返回值位于-2的位置 是value
{
printf("%s\n",lua_tostring(L,-2));
}
else if(lua_isnumber(L,-2))
{
printf("%d\n",(int)lua_tonumber(L,-2));
}
if(lua_isstring(L,-1)) //返回值位于-1的位置 是key
{
printf("%s\n",lua_tostring(L,-1));
}
else if(lua_isnumber(L,-1))
{
printf("%d\n",(int)lua_tonumber(L,-1));
}
lua_pop(L,1);
}
二维表的遍历类似于一维表 只是多了层嵌套而已
printf("二维表的遍历\n");
int it_idx;
lua_getglobal(L,"myShip");
t_idx=lua_gettop(L);
lua_pushnil(L);
while(lua_next(L,t_idx))
{
it_idx=lua_gettop(L);
lua_pushnil(L);
while(lua_next(L,it_idx))
{
printf("%s= ",lua_tostring(L,-2));
printf("%s\n",lua_tostring(L,-1));
lua_pop(L,1);
}
lua_pop(L,1);
}
我也是刚刚学lua 还不是很熟悉,尤其是栈这一块,目前只能做到用,满足要求,很难明白得透彻,还得靠以后多用,多领悟
下面是我参照别人的链接
http://www.360doc.com/content/11/1225/12/1317564_174844311.shtml
这图就是 遍历一维表的大致过程 是从别人那里摘取,还得谢谢他