Lua 作为配置文件(2)

来源:互联网 发布:经淘宝排查认定你实际 编辑:程序博客网 时间:2024/05/19 22:04

lua 语言非常灵活,一般把lua 作为脚本文件,会用C++与之进行交互。最重要的是C++代码能读取到脚本中的变量、一维表、二维表。

这样有些参数就可以在lua文件进行更改,而不用重新更改C++代码、又得重新编译、运行。

lua 文件 (test.lua )中的内容如下

[plain] view plaincopy
  1. -- ship include name width  height   
  2. yValue = 60  
  3. myStr = "guoyilongedu"  
  4. --one   
  5. cfg = {name = "test123" ,rotation = 180 , width = 123}  
  6. myShip = {}  
  7. for indx = 1,10 do  
  8. local mystring = string.format("%s%d","id",indx)  
  9. myShip[indx] = {}  
  10. myShip[indx].name =  mystring  
  11. myShip[indx].width = 140  
  12. myShip[indx].height =100  
  13. end  
  14. for index = 1,table.getn(myShip) do  
  15.   print(index,myShip[index].name,myShip[index].width,myShip[index].height)  
  16. end  
  17. for index ,value in pairs(cfg) do  
  18.  print(index,value)  
  19. end  
  20. print(yValue);  


如上面文件中的内容, yValue , myStr 就是lua 文件中的变量,cfg 是一维表 myShip 是二维表

[plain] view plaincopy
  1. #include <stdio.h>  
  2. extern "C"{  
  3. #include "lua.h"  
  4. #include "lualib.h"  
  5. #include "lauxlib.h"  
  6. }  
  7. /*Lua 解释器指针  
  8.  */  
  9. int main ( int argc, char *argv[] ){  
  10.  lua_State* L;  
  11. /*初始化Lua  
  12.  */  
  13.  L=lua_open();  
  14.   
  15.  luaopen_base(L);  
  16.  luaopen_table(L);  
  17.  luaopen_string(L);  
  18.  luaopen_math(L);  
  19.  lua_pushcfunction(L,l_getarr);  
  20.  lua_setglobal(L,"getarr");  
  21.    
  22.  /*运行脚本  
  23.  */  
  24.  if (luaL_dofile(L, "test.lua"))  
  25.  {  
  26.    printf("run script failed\n");  
  27.  }  
  28.  else  
  29.  {  
  30.  /* lua_getglobal(L,"result");  
  31.    if(lua_isnumber(L,-1))  
  32.     {  
  33.      printf("The result of the lua script is %d\n",lua_tonumber(L,-1));  
  34.     }  
  35.   */  
  36.   printf("输出变量\n");  
  37.   lua_getglobal(L,"yValue");  
  38.   if(lua_isnumber(L,-1))  
  39.    {  
  40.       printf("%s","ddddd\n");  
  41.       printf("%d",(int)lua_tointeger(L,-1));  
  42.    }  
  43.   lua_getglobal(L,"myStr");  
  44.   if(lua_isstring(L,-1))  
  45.   {  
  46.     printf("%s","\n");  
  47.     printf("%s\n",lua_tostring(L,-1));  
  48.   }  
  49.   /* 读取一维表  
  50.   */  
  51.   lua_getglobal(L,"cfg");  
  52.   if(lua_istable(L,-1))  
  53.   {  
  54.     lua_pushstring(L,"name");  
  55.     lua_gettable(L,-2);  
  56.      if(lua_isstring(L,-1))  
  57.       {  
  58.        printf("%s  %s\n","name",lua_tostring(L,-1));  
  59.       }  
  60.     lua_pop(L,1);   
  61.     lua_pushstring(L,"rotation");  
  62.     lua_gettable(L,-2);  
  63.      if(lua_isnumber(L,-1))  
  64.       {  
  65.        printf("%s  %d\n","rotation",(int)lua_tonumber(L,-1));  
  66.       }  
  67.      //清空栈  
  68.     lua_pop(L,2);  
  69.   }  
  70.    //用遍历的方式访问一维表  
  71.   lua_getglobal(L,"cfg");  
  72.   int t_idx=lua_gettop(L);  
  73.   lua_pushnil(L);  
  74.   printf("%s\n","用遍历的方式访问一维表");  
  75.   while(lua_next(L,t_idx)!=0)  
  76.   {  
  77.    // printf("%s %s\n",lua_typename(L,lua_type(L,-2)),lua_typename(L,lua_type(L,-1)));  
  78.     if(lua_isstring(L,-2))  
  79.      {  
  80.       printf("%s\n",lua_tostring(L,-2));  
  81.      }  
  82.     else if(lua_isnumber(L,-2))  
  83.      {  
  84.        printf("%d\n",(int)lua_tonumber(L,-2));  
  85.      }   
  86.   
  87.     if(lua_isstring(L,-1))  
  88.      {  
  89.       printf("%s\n",lua_tostring(L,-1));  
  90.      }  
  91.     else if(lua_isnumber(L,-1))  
  92.      {  
  93.        printf("%d\n",(int)lua_tonumber(L,-1));  
  94.      }   
  95.   
  96.  //  printf("%s\n",lua_tostring(L,-2));  
  97.   //  printf("%s\n",lua_tostring(L,-1));  
  98.     lua_pop(L,1);  
  99.   }  
  100.   //二维表的遍历  
  101.    printf("二维表的遍历\n");  
  102.    int it_idx;  
  103.   lua_getglobal(L,"myShip");  
  104.    
  105.   t_idx=lua_gettop(L);  
  106.   lua_pushnil(L);  
  107.   while(lua_next(L,t_idx))  
  108.    {  
  109.      it_idx=lua_gettop(L);  
  110.       lua_pushnil(L);  
  111.        while(lua_next(L,it_idx))  
  112.          {  
  113.              printf("%s= ",lua_tostring(L,-2));  
  114.                printf("%s\n",lua_tostring(L,-1));  
  115.                lua_pop(L,1);  
  116.          }  
  117.        lua_pop(L,1);  
  118.    }  
  119.      
  120.     
  121.  /* while (lua_next(L,-1))  
  122.     {  
  123.      lua_pushvalue(L,-2);  
  124.      const char * key =lua_tostring(L,-1);  
  125.      const char * value = lua_tostring(L,-2);  
  126.      printf("%s => %s\n",key ,value);  
  127.      lua_pop(L,2);  
  128.     }*/  
  129.  }  
  130.   
  131. /*清除Lua  
  132.  */  
  133.  lua_close(L);  
  134.   
  135.  return 0;  
  136.   
  137. }  


输出变量 

  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

 

这图就是 遍历一维表的大致过程 是从别人那里摘取,还得谢谢他

 

0 0
原创粉丝点击