zoukankan      html  css  js  c++  java
  • linux 进阶2--C++读取lua文件中的变量、一维表、二维表

    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
    ");
     }
     else
     {
     /* lua_getglobal(L,"result");
       if(lua_isnumber(L,-1))
        {
         printf("The result of the lua script is %d
    ",lua_tonumber(L,-1));
        }
      */
      printf("输出变量
    ");
      lua_getglobal(L,"yValue");
      if(lua_isnumber(L,-1))
       {
          printf("%s","ddddd
    ");
          printf("%d",(int)lua_tointeger(L,-1));
       }
      lua_getglobal(L,"myStr");
      if(lua_isstring(L,-1))
      {
        printf("%s","
    ");
        printf("%s
    ",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
    ","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
    ","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
    ","用遍历的方式访问一维表");
      while(lua_next(L,t_idx)!=0)
      {
       // printf("%s %s
    ",lua_typename(L,lua_type(L,-2)),lua_typename(L,lua_type(L,-1)));
        if(lua_isstring(L,-2))
         {
          printf("%s
    ",lua_tostring(L,-2));
         }
        else if(lua_isnumber(L,-2))
         {
           printf("%d
    ",(int)lua_tonumber(L,-2));
         } 
    
        if(lua_isstring(L,-1))
         {
          printf("%s
    ",lua_tostring(L,-1));
         }
        else if(lua_isnumber(L,-1))
         {
           printf("%d
    ",(int)lua_tonumber(L,-1));
         } 
    
     //  printf("%s
    ",lua_tostring(L,-2));
      //  printf("%s
    ",lua_tostring(L,-1));
        lua_pop(L,1);
      }
      //二维表的遍历
       printf("二维表的遍历
    ");
       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
    ",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
    ",key ,value);
         lua_pop(L,2);
        }*/
     }
    
    /*清除Lua
     */
     lua_close(L);
    
     return 0;
    
    }


    输出变量

      lua_getglobal(L,"yValue");  //得到变量
        if(lua_isnumber(L,-1)) //如果是数字
         {
             printf("%s","ddddd ");
            printf("%d",(int)lua_tointeger(L,-1));
         }

         lua_getglobal(L,"myStr");  //得到变量

          if(lua_isstring(L,-1))  //如果是字符串

            { printf("%s"," ");

                  printf("%s ",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 ","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 ","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 ","用遍历的方式访问一维表");

      while(lua_next(L,t_idx)!=0) // 开始遍历
      {
           if(lua_isstring(L,-2)) //返回值位于-2的位置 是value
         {
          printf("%s ",lua_tostring(L,-2));
         }
        else if(lua_isnumber(L,-2))
         {
           printf("%d ",(int)lua_tonumber(L,-2));
         }

        if(lua_isstring(L,-1)) //返回值位于-1的位置 是key
         {
          printf("%s ",lua_tostring(L,-1));
         }
        else if(lua_isnumber(L,-1))
         {
           printf("%d ",(int)lua_tonumber(L,-1));
         }

         lua_pop(L,1);
      }

    二维表的遍历类似于一维表 只是多了层嵌套而已

        printf("二维表的遍历 ");
       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 ",lua_tostring(L,-1));
                   lua_pop(L,1);
             }
           lua_pop(L,1);
       }

     我也是刚刚学lua 还不是很熟悉,尤其是栈这一块,目前只能做到用,满足要求,很难明白得透彻,还得靠以后多用,多领悟

    下面是我参照别人的链接

     http://www.360doc.com/content/11/1225/12/1317564_174844311.shtml

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

  • 相关阅读:
    IIS7中的几种身份鉴别方式(一)Basic身份验证
    IIS7中的几种身份鉴别方式(二)集成身份验证
    java集合
    SharePoint 2010中welcome page的设置细节
    SharePoint中使用Linq出现未将对象引用到实例化的解决方法
    SharePoint 2010中关于An error was encountered while retrieving the user profile的处理方式记录
    The Need for an Architectural Body of Knowledge
    The Softer Side of the Architect
    Event Receivers 学习小结
    使用SmtpClient发送带图片的邮件的代码实现
  • 原文地址:https://www.cnblogs.com/riskyer/p/3397947.html
Copyright © 2011-2022 走看看