Lua學習筆記 lua堆疊

2021-09-08 20:04:17 字數 2966 閱讀 4984

首先了解一下c++與lua之間的通訊:

假設在乙個lua檔案中有如下定義

-- hello.lua檔案

請注意紅色數字,代表通訊順序:

1)  c++想獲取lua的myname字串的值,所以它把myname放到lua堆疊(棧頂),以便lua能看到

2)lua從堆疊(棧頂)中獲取myname,此時棧頂再次變為空

3)lua拿著這個myname去lua全域性表查詢myname對應的字串

4)全域性表返回 乙個字串" beauty girl "

5)lua把取得的" beauty girl "字串放到堆疊(棧頂)

6)c++可以從lua 堆疊中取得" beauty girl "

若有9個 元素分別入棧,則:

1. 正數索引,棧底是1,然後一直到棧頂是逐漸+1,最後變成9

1. 負數索引,棧底是-9,然後一直到棧頂是逐漸+1,最後變成-1

索引相關:

1. 正數索引,不需要知道棧的大小,我們就能知道棧底在哪,棧底的索引永遠是1

2. 負數索引,不需要知道棧的大小,我們就能知道棧頂在哪,棧頂的索引永遠是-1

table型別入棧情況:

獲取table變數

現在,我們給hellolua.lua檔案新增乙個table全域性變數:

獲取hellotable變數的方式和以前是一樣的:

hellotable變數就放到lua堆疊的棧頂。(堆疊的順序從上至下)

可我們並不是要取table變數,因為c++中是無法識別lua的table型別的,所以我們要取得table中

具體的值,也就是name和iq的值。

lua_gettable函式

有乙個和lua_getglobal類似的函式,叫做lua_gettable,它是用來取得table相關資料的。

lua_gettable函式會從棧頂取得乙個值,然後根據這個值去table中尋找對應的值,最後把找到

的值放入棧頂。

lua_pushstring()函式可以把c++中的字串放到lua的棧裡;

然後再用lua_gettable()去執行前面所說的步驟,lua_gettable的第二個引數是指定的table變數在

棧中的索引。

為了照顧旁白這個笨蛋,我們畫個圖來理解:

這是初始 狀態,堆疊裡還沒有任何東西,那麼,現在要先把helltable變數放到棧頂:

/* lua堆疊取得table變數hellotable,在棧頂 */

lua_getglobal(pl, "hellotable");

然後就變成了這樣:

接著,我們要取得table的name對應的值,那麼,先要做的就是把 " name "

/* 將c++的字串放到lua的棧中,此時,棧頂變為"name",hellotable物件變為棧底 */

lua_pushstring(pl, "name");   // 把"name"字串壓入lua堆疊

然後變成這樣:

由於" name "的入棧,現在hellotable變數已經不在棧頂了。

接著,我們呼叫要做最重要的一步了,取得name在table中對應的值:

/* 從table物件尋找" name "對應的值(table物件現在在索引為-2的棧中,也就是棧底),

取得對應值之後,將值放回棧頂

lua_gettable(pl, -2);    // -2為table變數的索引,返回值為name的值" mutou "

此時,棧變成這樣:

lua_gettable()函式做了什麼事情?

首先,我們來解釋一下lua_gettable的第二個引數,-2是什麼意思,-2就是剛剛hellotable變數在棧中的索引。

然後,lua會去取得棧頂的值(之前的棧頂是」name」),然後拿著這個值去hellotable變數中尋找對應的值,當然就找到」mutou」了。

最後,lua會把找到的值入棧,於是」mutou」就到了棧頂了。

這樣仍然需要不同的函式將每種c型別的值壓入棧和乙個從不同函式從棧上取值。

使用 lua_push*(lua_state* l, x)壓棧,(c++)把資料值壓入lua堆疊

使用 lua_to(lua_state* l, 棧中位置),(c++)從lua堆疊中取值

使用 lua_pop(lua_state* l, 出棧個數),清除lua堆疊

lua_tostring()函式返回乙個指向字串的內部拷貝的指標。你不能修改它(使你想起那裡有乙個const)。

只要這個指標對應的值還在棧內,lua會保證這個指標一直有效。當乙個c函式返回後,lua會清理它的

棧,所以,有乙個原則:永遠不要將指向lua字串的指標儲存到訪問他們的外部函式 中

lua學習筆記

近日時間比較充裕,學習一下lua語言,順便寫下筆記,方便以後加深學習。c c 呼叫lua動態庫及標頭檔案位址 用於c c 嵌入lua指令碼解析 也可以到或找適合自己的版本。一 hello world 哈哈,先使用經典的hello world帶進門 1.在 執行 鍵入cmd開啟dos視窗,並將當前目錄...

Lua 學習筆記

1 關於table lua 中的 table 是python 中的 list 和 dict 的混合體。t 相當於 t 簡單的看,實際上完全相當於 python 中的 dict 不過實際對於鍵為整數的,是放在 list 中的,方便快速索引。當然基於節省記憶體的考量,對於跳躍的大整數鍵,依然是放在 di...

lua學習筆記

lua users.org lua manual luagit chunkspy openresty nginx lua module lua 中值為nil時,相當於c語言的空指標,還是需要小心謹慎。table使用有幾個易錯點,請看下圖 local m m search key m result v...