用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]的值
- int getfield(lua_State *L,int key)
- {
- int result = 0;
- lua_pushnumber(L,key);
- lua_gettable(L,-2);
- if (!lua_isnumber(L,-1))
- cout<<"error"<<endl;
- result = (int)lua_tonumber(L,-1);
- lua_pop(L,1);
- return result;
- }
雖然代碼最終運行成功。但是過程中,各種bug。
在書上找到一個函數
- staticvoid stackDump(lua_State *L);
作用是打印交換棧裡的數據。
有了這個函數之後,我們對交換棧裡的數據情況,就看得一清二楚了。
//完整代碼
- #include <iostream>
- #include <stdio.h>
- usingnamespace std;
- extern"C"
- {
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- };
- lua_State *L;
- staticvoid stackDump(lua_State *L)
- {
- int top = lua_gettop(L);
- for (int i = 1; i <= top; i++)
- {
- int t = lua_type(L,i);
- switch(t)
- {
- case LUA_TSTRING:
- printf("'%s'",lua_tostring(L,i));
- break;
- case LUA_TBOOLEAN:
- printf(lua_toboolean(L,i)?"true":"false");
- break;
- case LUA_TNUMBER:
- printf("%g",lua_tonumber(L,i));
- break;
- default:
- printf("%s",lua_typename(L,t));
- }
- printf(" ");
- }
- printf("\n");
- }
- int getfield(lua_State *L,int key)
- {
- int result = 0;
- lua_pushnumber(L,key);
- cout<<"pushnmber : ";
- stackDump(L);
- cout<<"gettable : ";
- lua_gettable(L,-2);
- stackDump(L);
- if (!lua_isnumber(L,-1))
- cout<<"error"<<endl;
- result = (int)lua_tonumber(L,-1);
- cout<<"lua_tonumber : ";
- stackDump(L);
- lua_pop(L,1);
- cout<<"lua_pop : ";
- stackDump(L);
- return result;
- }
- int main()
- {
- L = lua_open();
- luaL_openlibs(L);
- luaL_dofile(L,"test.lua");
- cout<<"start : ";
- stackDump(L);
- lua_getglobal(L,"a");
- cout<<"getglobal : ";
- stackDump(L);
- for (int i = 1; i <= 3; i++)
- {
- cout<<"result:"<<getfield(L,i)<<endl;
- }
- cout<<endl;
- system("pause");
- lua_close(L);
- return 0;
- }
//test.lua
a = {11,12,13}
截圖看下結果。
最右是棧頂。數據變化很清楚。Getfield函數式假設table已經在棧頂。所以我們在前面必須先用lua_getglobal把table放到棧頂。Pushnumber會把數據壓棧。接著gettable會取棧頂的數據,根據給出的table位置,這裡是-2,計算出table[棧頂]的數據,把它壓棧。Pop則是從棧裡退出數據,恢復到一開始的狀態。