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

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

  • 相关阅读:
    Gogs http和ssh地址显示localhost的问题
    SQL Server从读写频繁的大表中删除大批量数据
    Java Spring Boot: Unable to determine jdbc url from datasource
    NPOI导入Excel日期格式的处理
    手把手教你整合最优雅SSM框架
    JDBC链接数据库MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法
    Vim 入门教程
    jquery.i18n.properties前端国际化方案
    生产者消费者模式中条件判断是使用while而不是if
    ThreadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
  • 原文地址:https://www.cnblogs.com/riskyer/p/3397947.html
Copyright © 2011-2022 走看看