首先了解下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(
9大於1)
2. 負數索引,棧底是-9
,然後一直到棧頂是逐漸
+1,最後變成-1(
-1大於-9)
索引相關:
1. 正數索引,不需要知道棧的大小,我們就能知道棧底在哪,棧底的索引永遠是1
2. 負數索引,不需要知道棧的大小,我們就能知道棧頂在哪,棧頂的索引永遠是-1
table型別入棧情況(
:)獲取table
變數現在,我們給hellolua.lua
檔案新增乙個
table
全域性變數:
[cpp]
view plain
copy
print?
-- hellolua.lua檔案
myname = "beauty girl"
hellotable =
我們看到,多了乙個hellotable
的變數,它和陣列十分相似,又和
hashmap
有點類似,總之它很強大。
話說,125乘以2
等於多少?
...250 ....o o!
獲取hellotable
變數的方式和以前是一樣的:
[cpp]
view plain
copy
print?
/* 取得table變數,在棧頂 */
lua_getglobal(pl, "hellotable"
);
這樣,hellotable
變數就被存放到棧頂。
可我們並不是要取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
變數在棧中的索引。
為了照顧旁白這個笨蛋,我們畫個圖來理解:
這是初始狀態,堆疊裡還沒有任何東西,那麼,現在要先把hellotable
變數放到棧頂:
[cpp]
view plain
copy
print?
/* 取得table變數,在棧頂 */
lua_getglobal(pl, "hellotable"
);
然後就變成了這樣:
接著,我們要取得table
的name
對應的值,那麼,先要做的就是把」name」字串入棧:
[cpp]
view plain
copy
print?
/* 將c++的字串放到lua的棧中,此時,棧頂變為「name」, hellotable物件變為棧底 */
lua_pushstring(pl, "name"
);
然後變成這樣:
注意了,我把棧的索引也加上了,因為我們即將要使用,這次我們用負數索引(不了解負數的索引的朋友請閱讀第03
章的教程哈~)。
由於」name」的入棧,現在hellotable
變數已經不在棧頂了。
接著,我們呼叫要做最重要的一步了,取得name
在table
中對應的值:
[cpp]
view plain
copy
print?
/* 從table物件尋找「name」對應的值(table物件現在在索引為-2的棧中,也就是當前的棧底),
取得對應值之後,將值放回棧頂
*/lua_gettable(pl, -2);
此時,棧變成這樣:
lua_gettable倒底做了什麼事情?
首先,我們來解釋一下lua_gettable
的第二個引數,
-2是什麼意思,
-2就是剛剛
hellotable
變數在棧中的索引。
然後,lua
會去取得棧頂的值(之前的棧頂是」name」),然後拿著這個值去hellotable
變數中尋找對應的值,當然就找到」mutou」了。
最後,lua
會把找到的值入棧,於是」mutou」就到了棧頂了。
這樣仍然需要不同的函式將每種c型別的值壓入棧和乙個從不同函式從棧上取值(並不彈出)。
使用lua_push*(
lua_state * l,x
)壓棧,
使用lua_to*(l
ua_state * l,棧中位置
)取值,
使用lua_pop(l
ua_state * l,出棧個數
)出棧。
lua_tostring函式返回乙個指向字串的內部拷貝的指標。你不能修改它(使你想起那裡有乙個const)。只要這個指標對應的值還在棧內,lua會保證這個指標一直有效。當乙個c函式返回後,lua會清理他的棧,所以,有乙個原則:
永遠不要將指向
lua字串的指標儲存到訪問他們的外部函式中。
Lua錯誤摘要
lua連線資料庫時報以上錯誤,下面是執行的指令碼摘錄 local cjson require cjson local mysql require resty.mysql local db mysql new db set timeout 10000 local props local res db ...
Lua學習筆記 lua堆疊
首先了解一下c 與lua之間的通訊 假設在乙個lua檔案中有如下定義 hello.lua檔案 請注意紅色數字,代表通訊順序 1 c 想獲取lua的myname字串的值,所以它把myname放到lua堆疊 棧頂 以便lua能看到 2 lua從堆疊 棧頂 中獲取myname,此時棧頂再次變為空 3 lu...
Lua呼叫原理展示(lua的堆疊)
若lua虛擬機器堆疊裡有n個元素,則可以用 1 n 從棧底向上索引,也可以用 1 n 從棧頂向下索引,一般後者更加常用 堆疊的每個元素可以為任意複雜的lua資料型別,堆疊中沒有元素的空位,隱含為包含乙個 空 型別資料 若有4個元素分別入棧,則 正數索引,棧底是1,然後一直到棧頂是逐漸 1,最後變成4...