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


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

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

    1. lua_State* L;//定义一个全局变量
    2. ***************************
    3. L = luaL_newstate();
    4. luaL_openlibs(L);
    5. //打开Lua脚本文件
    6. std::string path = SysContext::instance()->_env["WORKSPACE"] + "test.lua";
    7. luaL_dofile(L, path.c_str());
    8. lua_getglobal(L, "output"); //加载lua文件中的output函数
    9. pushLua(ObjsData(数据));
    10. int iRet = lua_pcall(L, 1, 1, 0);
    11. if (iRet) // 调用出错
    12. {
    13. const char* pErrorMsg = lua_tostring(L, -1);
    14. lua_pop(L, 1);
    15. lua_close(L);
    16. return 1;
    17. }
    18. if (lua_isnumber(L, -1)) //取值输出
    19. {
    20. int fValue = lua_tonumber(L, -1);
    21. printf("fValue:%f\n", fValue);
    22. //do something
    23. }
    24. if (lua_isstring(L, -1)) //取值输出
    25. {
    26. std::string s = lua_tostring(L, -1);
    27. // do something
    28. }
    29. 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

    1. void pushLua(ObjsData* obj) {
    2. int ntop = lua_gettop(L);
    3. lua_newtable(L);
    4. lua_pushstring(L, "count"); //这里需要output多一个输入
    5. lua_pushnumber(L, obj->count);
    6. lua_settable(L, -3);
    7. lua_pushstring(L, "objs"); //整体输入一个大的 table
    8. for (int i = 0; i < obj->count; i++) {
    9. const SingleObj* p = (const SingleObj*)&obj[1];
    10. lua_newtable(L);
    11. lua_pushnumber(L, i);
    12. lua_newtable(L);
    13. lua_pushstring(L, "x");
    14. lua_pushnumber(L, p->x);
    15. lua_settable(L, -3);
    16. lua_pushstring(L, "y");
    17. lua_pushnumber(L, p->y);
    18. lua_settable(L, -3);
    19. lua_pushstring(L, "z");
    20. lua_pushnumber(L, p->z);
    21. lua_settable(L, -3);
    22. lua_pushstring(L, "Volume");
    23. lua_pushnumber(L, p->volume);
    24. lua_settable(L, -3);
    25. lua_settable(L, -3);
    26. }
    27. lua_settable(L, -3);
    28. }

    lua脚本如下:

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

    1. str = "test"
    2. function output(x)
    3. print(x.objs[0].x)
    4. res= "count="..tostring(x.count)..",x="..tostring(x.objs[0].x)..",y="..tostring(x.objs[0].y).."\n"
    5. return res
    6. end

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

  • 相关阅读:
    信息系统项目管理师核心考点(二十八)项目进度计划输出(成果)
    Java代码审计——WebGoat XML外部实体注入(XXE)
    LeetCode每日一题(1937. Maximum Number of Points with Cost)
    用sql server知识回答
    矩阵分析与计算学习记录-矩阵分解
    ros项目开发之在clion开发工具中增加c++模板类
    darknet 结构体汇总
    可视化规则引擎
    (附源码)springboot 中小学餐饮配送系统 毕业设计645661
    【网页前端】CSS之拓展样式以及Emmet语法
  • 原文地址:https://blog.csdn.net/xiachong27/article/details/134527632