c++调用Lua(table嵌套写法)

通过c++调用lua接口将数据存储到虚拟栈中,就可以在lua脚本在虚拟栈中取得数据

c++调用lua库,加载lua文件,

cpp 复制代码
lua_State* L;//定义一个全局变量

***************************

    L = luaL_newstate();
    luaL_openlibs(L);
    //打开Lua脚本文件
    std::string path = SysContext::instance()->_env["WORKSPACE"] + "test.lua";
    luaL_dofile(L, path.c_str());
    lua_getglobal(L, "output");  //加载lua文件中的output函数
    pushLua(ObjsData(数据));
    int iRet = lua_pcall(L, 1, 1, 0);

    if (iRet)  // 调用出错
    {
      const char* pErrorMsg = lua_tostring(L, -1);
      lua_pop(L, 1);
      lua_close(L);
      return 1;
    }

    if (lua_isnumber(L, -1))  //取值输出
    {
      int fValue = lua_tonumber(L, -1);
      printf("fValue:%f\n", fValue);
      //do something
    }
    if (lua_isstring(L, -1))  //取值输出
    {
      std::string s = lua_tostring(L, -1);
      // do something
    }
    lua_close(L);

以下为c++调用lua接口存储数据

其中 lua_settable(L, -3);

就是把表在lua堆栈中的值弹出来,index 是table 在堆栈中的位置,假如 table 在 -3, 则key 应该是 -2,value 是 -1

结构:最外层table=count+objs,count和objs都是一个table,objs内部又包含很多个table

cpp 复制代码
void pushLua(ObjsData* obj) {
  int ntop = lua_gettop(L);
  lua_newtable(L);

  lua_pushstring(L, "count");  //这里需要output多一个输入
  lua_pushnumber(L, obj->count);
  lua_settable(L, -3);

  lua_pushstring(L, "objs");  //整体输入一个大的 table
  for (int i = 0; i < obj->count; i++) {
    const SingleObj* p = (const SingleObj*)&obj[1];
    lua_newtable(L);
    lua_pushnumber(L, i);

    lua_newtable(L);

    lua_pushstring(L, "x");
    lua_pushnumber(L, p->x);
    lua_settable(L, -3);

    lua_pushstring(L, "y");
    lua_pushnumber(L, p->y);
    lua_settable(L, -3);

    lua_pushstring(L, "z");
    lua_pushnumber(L, p->z);
    lua_settable(L, -3);

    lua_pushstring(L, "Volume");
    lua_pushnumber(L, p->volume);
    lua_settable(L, -3);

    lua_settable(L, -3);
  }
  lua_settable(L, -3);
}

lua脚本如下:

注意:table(键值对结构)嵌套,在取值的时候采用中括号取值,如objs[0]["x"],若key值是字符串,可以写成objs[0].x,但是数字应该只能写中括号的形式

Lua 复制代码
str = "test" 
function output(x)
   print(x.objs[0].x)
    res= "count="..tostring(x.count)..",x="..tostring(x.objs[0].x)..",y="..tostring(x.objs[0].y).."\n"
    return res
end

参考:[Resolved] How to create nested Lua tables using the C API

相关推荐
捕鲸叉5 小时前
怎样在软件设计中选择使用GOF设计模式
c++·设计模式
捕鲸叉5 小时前
C++设计模式和编程框架两种设计元素的比较与相互关系
开发语言·c++·设计模式
未知陨落6 小时前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树
一丝晨光6 小时前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++
汉克老师7 小时前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节
姆路8 小时前
QT中使用图表之QChart绘制动态折线图
c++·qt
秋说9 小时前
【数据结构 | C++】整型关键字的平方探测法散列
数据结构·c++·算法
好看资源平台9 小时前
爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具
爬虫·lua·postman
槿花Hibiscus11 小时前
C++基础:Pimpl设计模式的实现
c++·设计模式
黑不拉几的小白兔12 小时前
PTA部分题目C++重练
开发语言·c++·算法