Lua和C++交互 學習記錄之五:全局數組交互


主要內容轉載自:子龍山人博客(強烈建議去子龍山人博客完全學習一遍)

部分內容查閱自:《Lua 5.3  參考手冊》中文版 譯者 雲風 制作 Kavcc

 

vs2013+lua-5.3.3

 

1.數組

①數組是key值從1開始並連續遞增的table。

②索引號是從1開始,不是從0開始。

 

2.既然是table,那當然是可以用上一節的內容進行讀寫的。

lua還提供了一些只針對數組進行操作的API,如下:

①LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);

使用於數組,可得到數組元素個數;

以數字形式返回給定索引處值的“長度”; 它等價於在 Lua 中調用 '#' 的操作。(非數組使用#將得不到正確的值)

如果操作結果不是一個整數,則拋出一個錯誤。(這種情況只發生在觸發元方法時。)

 

②LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n);

注意對應的lua_rawget函數。

獲取索引號n的數組值,返回的int值為值的類型。

這是一次直接訪問,不會觸發元方法,效率高。

 

③LUA_API void  (lua_rawseti) (lua_State *L, int idx, lua_Integer n);

注意對應的lua_rawset函數

設置索引號n的數組值。

這個函數會將值彈出棧。 賦值是直接的;即不會觸發元方法,效率高。

 

3.C++讀取Lua中數組

①Lua中數組

global_c_read_array = {5,6.78,"array string"}

②C++中讀取

 1 //lua->stack,得到全局數組,位置-1
 2     lua_getglobal(L, "global_c_read_array");  3 
 4     //得到數組長度
 5     lua_Integer array_len = luaL_len(L, -1);  6     for (lua_Integer i = 1; i <= array_len; ++i){  7         //lua->stack,全局數組位置-1,然后i為對應的索引值,將返回值放到-1的位置
 8         int ret_type = lua_rawgeti(L, -1, i);  9 
10         //--------------被替代的原操作table函數------------- 11         //lua_pushinteger(L, i); 12         //int ret_type = lua_gettable(L, -2); //也可以使用int ret_type = lua_rawget(L, -2); 13 
14         //stack->c
15         if (ret_type == LUA_TNUMBER){ 16             if (lua_isinteger(L, -1)){ 17                 printf("%lld\n", lua_tointeger(L, -1)); 18  } 19             else if (lua_isnumber(L, -1)){ 20                 printf("%g\n", lua_tonumber(L, -1)); 21  } 22  } 23         else if (ret_type == LUA_TSTRING){ 24             printf("%s\n", lua_tostring(L, -1)); 25  } 26 
27         lua_pop(L, 1); 28     }

 

4.C++寫入Lua數組

①C++寫入

 1 //c->stack,創建一個新的table放到-1的位置
 2  lua_newtable(L);  3 
 4     //c->stack,創建對應的key-val
 5     lua_pushinteger(L, 7); //設置值
 6     lua_rawseti(L, -2, 1);//對應key-val
 7 
 8     lua_pushnumber(L, 8.9); //設置值
 9     lua_rawseti(L, -2, 2);//對應key-val
10 
11     lua_pushstring(L, "test_string");//設置值
12     lua_rawseti(L, -2, 3);//對應key-val 13 
14     //--------------被替代的原操作table函數------------- 15     //lua_pushinteger(L, 1); //設置key 16     //lua_pushinteger(L, 7);//設置值 17     //lua_settable(L, -3); //也可以使用lua_rawset(L,-3); 18 
19     //lua_pushinteger(L, 2); //設置key 20     //lua_pushnumber(L, 8.9);//設置值 21     //lua_settable(L, -3); //也可以使用lua_rawset(L,-3); 22 
23     //lua_pushinteger(L, 3); //設置key 24     //lua_pushstring(L, "test_string");//設置值 25     //lua_settable(L, -3); //也可以使用lua_rawset(L,-3); 26 
27     
28     //stack->lua,將數組賦值到lua中,並彈出數組
29     lua_setglobal(L, "global_c_write_array");

②在hello.lua文件中Lua讀取

1 if global_c_write_array then
2     for i = 1, #global_c_write_array do
3         print("v = ", global_c_write_array[i]) 4     end
5 end

 

Lua和C++交互系列:

Lua和C++交互 學習記錄之一:C++嵌入腳本

Lua和C++交互 學習記錄之二:棧操作

Lua和C++交互 學習記錄之三:全局值交互

Lua和C++交互 學習記錄之四:全局table交互

Lua和C++交互 學習記錄之五:全局數組交互

Lua和C++交互 學習記錄之六:全局函數交互

Lua和C++交互 學習記錄之七:C++全局函數注冊為Lua模塊

Lua和C++交互 學習記錄之八:C++類注冊為Lua模塊

Lua和C++交互 學習記錄之九:在Lua中以面向對象的方式使用C++注冊的類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM