歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Lua筆記----C++調用Lua腳本中二維table的數據

用Lua裡的table可以實現C++中的數組。Lua的作用一般是用來配置。我把配置的東西寫在lua的table裡。現在我想要在C++中調用lua中的table,從而把數據傳到C++的數組中。
 
先搞一個一維的table。我是看了《lua程序設計第二版》的25.2節。貌似沒有API直接能夠取直接取得table的值。或者我不知道吧。書上是用一個getfield函數實現。也就是可能要根據自己的需要重寫它。於是模仿的寫一個。

相關鏈接:Lua程序設計(第2版)中文 PDF  http://www.linuxidc.com/Linux/2013-03/81833.htm

作用是取得table[key]的值

  1. int getfield(lua_State *L,int key)
  2. {
  3. int result = 0;
  4. lua_pushnumber(L,key);
  5. lua_gettable(L,-2);
  6. if (!lua_isnumber(L,-1))
  7. cout<<"error"<<endl;
  8. result = (int)lua_tonumber(L,-1);
  9. lua_pop(L,1);
  10. return result;
  11. }

雖然代碼最終運行成功。但是過程中,各種bug。

在書上找到一個函數

  1. staticvoid stackDump(lua_State *L);

作用是打印交換棧裡的數據。

有了這個函數之後,我們對交換棧裡的數據情況,就看得一清二楚了。

//完整代碼

  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 key)
  36. {
  37. int result = 0;
  38. lua_pushnumber(L,key);
  39. cout<<"pushnmber : ";
  40. stackDump(L);
  41. cout<<"gettable : ";
  42. lua_gettable(L,-2);
  43. stackDump(L);
  44. if (!lua_isnumber(L,-1))
  45. cout<<"error"<<endl;
  46. result = (int)lua_tonumber(L,-1);
  47. cout<<"lua_tonumber : ";
  48. stackDump(L);
  49. lua_pop(L,1);
  50. cout<<"lua_pop : ";
  51. stackDump(L);
  52. return result;
  53. }
  54. int main()
  55. {
  56. L = lua_open();
  57. luaL_openlibs(L);
  58. luaL_dofile(L,"test.lua");
  59. cout<<"start : ";
  60. stackDump(L);
  61. lua_getglobal(L,"a");
  62. cout<<"getglobal : ";
  63. stackDump(L);
  64. for (int i = 1; i <= 3; i++)
  65. {
  66. cout<<"result:"<<getfield(L,i)<<endl;
  67. }
  68. cout<<endl;
  69. system("pause");
  70. lua_close(L);
  71. return 0;
  72. }

 

//test.lua

a = {11,12,13}

截圖看下結果。

 

最右是棧頂。數據變化很清楚。Getfield函數式假設table已經在棧頂。所以我們在前面必須先用lua_getglobal把table放到棧頂。Pushnumber會把數據壓棧。接著gettable會取棧頂的數據,根據給出的table位置,這裡是-2,計算出table[棧頂]的數據,把它壓棧。Pop則是從棧裡退出數據,恢復到一開始的狀態。

Copyright © Linux教程網 All Rights Reserved