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

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

linux 进阶2--C++读取lua文件中的变量、一维表、二维表的更多相关文章

  1. [Linux][C][gcc][tips] 在头文件中定义变量引发的讨论

    概述 本人的原创文章,最先发表在github-Dramalife-note中.转载请注明出处. Define variable(s) in header file referenced by mult ...

  2. python保存二维列表到txt文件,读取txt文件里面的数据转化为二维列表

    源码: # 读文件里面的数据转化为二维列表 def Read_list(filename): file1 = open(filename+".txt", "r" ...

  3. SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)

    读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...

  4. 读取Excel文件中的单元格的内容和颜色

    怎样读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.O ...

  5. Linux命令行批量替换多文件中的字符串【转】

    Linux命令行批量替换多文件中的字符串[转自百度文库] 一种是Mahuinan法,一种是Sumly法,一种是30T法分别如下: 一.Mahuinan法: 用sed命令可以批量替换多个文件中的字符串. ...

  6. linux sed 批量替换多个文件中的字符

    格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` linux sed 批量替换多个文件中的字符串 sed -i "s/oldst ...

  7. java 中读取本地文件中字符

    java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...

  8. Java中读取txt文件中中文字符时,出现乱码的解决办法

    这是我写的一个Java课程作业时,遇到的问题. 问题描述: 我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组. 我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码. 最 ...

  9. Flex读取txt文件中的内容(三)

    Flex读取txt文件中的内容 1.设计源码 LoadTxt.mxml: <?xml version="1.0" encoding="utf-8"?> ...

随机推荐

  1. 怎么分辨linux系统是虚拟机还是物理机

    用lspci -b|grep "VMware"抓取系列信息,即表明此系统的宿主机是基于VMware虚拟出来的,别的可以照葫芦画瓢来!

  2. 转--activemq的官方中文文档

    1 JMS 在介绍ActiveMQ之前,首先简要介绍一下JMS规范. 1.1 JMS的基本构件 1.1.1 连接工厂 连接工厂是客户用来创建连接的对象,例如ActiveMQ提供的ActiveMQCon ...

  3. mybatis No enum const class org.apache.ibatis.type.JdbcType.Date 坑爹的配置

    转自:https://lihaiming.iteye.com/blog/2248059 在ibatis中不需要关注这些参数 而转到mybatis后 如果字段值为空 必须设置jdbcType如inser ...

  4. FilreDAC DLL共享数据连接

    D:\Users\Public\Documents\Embarcadero\Studio\16.0\Samples\Object Pascal\Database\FireDAC\Samples\Com ...

  5. 跟着太白老师学python day10 名称空间,作用域和取值顺序,变量的加载顺序

    名称空间分为3种: 1. 全局名称空间 2. 内置名称空间 3. 局部名称空间(临时) 作用域 全局作用域              1全局名称空间 2 内置名称空间 局部作用域           ...

  6. Linux 下VI文件乱码解决

    linux在vi 模式查看文件会有乱码问题 如图: 怎么解决呢? 在vi中输入冒号 然后执行下面的命令 如果系统编码不是utf8,vi看uft8编码文件时这样用:set termencoding=ut ...

  7. javaScript字符串操作

    JS自带函数concat将两个或多个字符的文本组合起来,返回一个新的字符串.var a = "hello";var b = ",world";var c = a ...

  8. mySQL中插入多条记录

    用一条INSERT向SQL中插入多条记录 2008-12-22 10:07:01|  分类: 记事本_编程技术|举报|字号 订阅     Sql 语法: 插入多行记录 Insert Into Tabl ...

  9. Unity Pitfall 汇总

    [Unity Pitfall 汇总] 1. 当脚本被绑定到一个对象时,一个类对象即会被创建,此意味着此类构造函数会被调用.所以在构造函数中不要调用任何运行时才创建的类.相应的初始化方代码应该移至Sta ...

  10. JAVA heap space 内存溢出

    3月28日开始使用JAVA调用SAP RFC后提示内存溢出 尝试增加set java_OPTS.....但仍然提示内存溢出 最终设置方法