打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Lua笔记

Lua笔记----C++调用Lua脚本中二维table的数据

[日期:2013-03-28] 来源:Linux社区  作者:yao2yao [字体: ]

接着搞一个二维的table。这也是我需要配置的目的所在。
 
//test.lua
 
t ={ {11,12,13},{21,22,23} ,}
 
最后的逗号,好像可有可无。Lua脚本语法比C++宽松多了。
 
首先我们要修改getfield。作用是取得table[key1][key2]的值

  1. int getfield(lua_State *L,int key1,int key2)
  2. {
  3. int result = 0;
  4. lua_pushnumber(L,key1);
  5. lua_gettable(L,-2);
  6. lua_pushnumber(L,key2);
  7. lua_gettable(L,-2);
  8. if (!lua_isnumber(L,-1))
  9. cout<<"error"<<endl;
  10. result = (int)lua_tonumber(L,-1);
  11. lua_pop(L,2); //退两个元素
  12. return result;
  13. }

关键点是在pop时,退了两个元素。

//完整代码

  1. #include <iostream>
  2. #include <stdio.h>
  3. usingnamespace std;
  4. extern"C"
  5. {
  6. #include "lua.h"
  7. #include "lualib.h"
  8. #include "lauxlib.h"
  9. };
  10. lua_State *L;
  11. staticvoid stackDump(lua_State *L)
  12. {
  13. int top = lua_gettop(L);
  14. for (int i = 1; i <= top; i++)
  15. {
  16. int t = lua_type(L,i);
  17. switch(t)
  18. {
  19. case LUA_TSTRING:
  20. printf("'%s'",lua_tostring(L,i));
  21. break;
  22. case LUA_TBOOLEAN:
  23. printf(lua_toboolean(L,i)?"true":"false");
  24. break;
  25. case LUA_TNUMBER:
  26. printf("%g",lua_tonumber(L,i));
  27. break;
  28. default:
  29. printf("%s",lua_typename(L,t));
  30. }
  31. printf(" ");
  32. }
  33. printf("\n");
  34. }
  35. int getfield(lua_State *L,int key1,int key2)
  36. {
  37. int result = 0;
  38. lua_pushnumber(L,key1);
  39. cout<<"pushnumber : ";
  40. stackDump(L);
  41. lua_gettable(L,-2);
  42. cout<<"gettable : ";
  43. stackDump(L);
  44. lua_pushnumber(L,key2);
  45. cout<<"pushnumber : ";
  46. stackDump(L);
  47. lua_gettable(L,-2);
  48. cout<<"gettable : ";
  49. stackDump(L);
  50. if (!lua_isnumber(L,-1))
  51. cout<<"error"<<endl;
  52. result = (int)lua_tonumber(L,-1);
  53. cout<<"tonumber : ";
  54. stackDump(L);
  55. lua_pop(L,2);
  56. cout<<"lua_pop : ";
  57. stackDump(L);
  58. return result;
  59. }
  60. int main()
  61. {
  62. L = lua_open();
  63. luaL_openlibs(L);
  64. luaL_dofile(L,"test.lua");
  65. cout<<"start : ";
  66. stackDump(L);
  67. lua_getglobal(L,"t");
  68. cout<<"getglobal : ";
  69. stackDump(L);
  70. for (int i = 1; i <= 2; i++)
  71. for (int j = 1; j <= 3; j++)
  72. {
  73. cout<<"result:"<<getfield(L,i,j)<<endl;
  74. }
  75. cout<<endl;
  76. system("pause");
  77. lua_close(L);
  78. return 0;
  79. }

结果部分截图

这样C++就调用了lua里二维table的数据。
 
这里table里是number型,如果是其他类型,需要自己重写getfield函数。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Step By Step(C调用Lua)(转)
【lua 与c#交互原理】
c中读取Lua的全局变量数组
Lua和C 交互详细总结
Redis源码学习:Lua脚本
【原创】同行列对角线的格子
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服