①若lua虛擬機器堆疊裡有n個元素,則可以用 1 ~ n 從棧底向上索引,也可以用 -1 ~ -n 從棧頂向下索引,一般後者更加常用
②堆疊的每個元素可以為任意複雜的lua資料型別,堆疊中沒有元素的空位,隱含為包含乙個「空」型別資料
若有4個元素分別入棧,則:
①. 正數索引,棧底是1,然後一直到棧頂是逐漸+1,最後變成4(4大於1)
②. 負數索引,棧底是-4,然後一直到棧頂是逐漸+1,最後變成-1(-1大於-4)
①. 正數索引,不需要知道棧的大小,我們就能知道棧底在哪,棧底的索引永遠是1
②. 負數索引,不需要知道棧的大小,我們就能知道棧頂在哪,棧頂的索引永遠是-1
直接進入主題了,正如上節例項**:
lua**:
[sql]
view plain
copy
--filename: luafile.lua
function
luafunc()
return
1,2,3,4;
endc++**(其他**工作原理一樣的這裡宿主語言使用c++好了):
[cpp]
view plain
copy
/*** 函式名:func
* 日期:2023年11月13日20:46:54
**/// luatest.cpp : 定義控制台應用程式的入口點。
//
#include "stdafx.h"
#include
#include "lua.hpp"
/*** 等價於:
* extern "c"
**/int
_tmain(
intargc, _tchar* argv)
執行結果:
現在來開始分析過程:①~~④步
[cpp]
view plain
copy
//①新建虛擬機器
lua_state *l = lual_newstate();
//②載入庫
lual_openlibs(l);
//③這裡執行 test.lua lua檔案
lual_dofile(l, "test.lua"
);
//④重新設定棧底
lua_settop(l, 0);
這裡注釋都寫 明白了吧,
①~③:建立棧,然後載入資源;
④:這個過程,是為了確認
棧底是空的,以便後面的操作是按照順序入棧的且
從1號棧位開始
[cpp]
view plain
copy
//⑤獲取 返回結果
lua_getglobal(l, "luafunc"
);
⑤:這步開始 c++去訪問虛擬機器的 棧,送「luafunc"
入棧[cpp]
view plain
copy
//⑥操作棧調回結果
lua_pcall(l, 0, 4, 0);
⑥:(以下精華,望笑納)
1> c++告訴lua虛擬機器(l),函式以輸入棧,函式傳入0個引數,會返回4個函式,不需要錯誤資訊(0)。(分別 對應上面四個引數)。(棧中乙個元素:「luafunc" )
2> 這裡,c++(宿主語言)請求完畢了,虛擬機器(l)開始訪問棧,從棧中取出「luafunc"。(棧中無元素了:null)
3> 虛擬機器得到 「luafunc" 資訊送給 lua程式(編譯器)。(棧中無元素了:null)
4> lua程式 在 呼叫的 lua檔案全域性表(global table)中查詢 「luafunc" ,並執行返回結果「1,2,3,4」。(棧中無元素了:null)
5> lua程式得到返回結果「1,2,3,4」 將結果再壓入棧;壓入順序為,順序的,「1」先入棧底,「2」再入棧,以此類推。(棧中四個元素:1,2,3,4)(順序為棧底->棧頂)
6> 最後,c++(宿主語言)再去棧中讀取資料;這裡 lua_tostring(l,1)是讀取函式,不會改變棧內的結果的,所以當地⑥步執行完,棧中還是四個元素:1,2,3,4
⑦這步也很重要,使用完虛擬機器,需要手動關閉的。
敘述完畢,有何指教請指導啊。
謝謝支援哈。
Lua學習筆記 lua堆疊
首先了解一下c 與lua之間的通訊 假設在乙個lua檔案中有如下定義 hello.lua檔案 請注意紅色數字,代表通訊順序 1 c 想獲取lua的myname字串的值,所以它把myname放到lua堆疊 棧頂 以便lua能看到 2 lua從堆疊 棧頂 中獲取myname,此時棧頂再次變為空 3 lu...
lua的堆疊(摘要)
首先了解下c 與lua之間的通訊 假設在乙個lua檔案中有如下定義 hello.lua 檔案 請注意紅色數字,代表通訊順序 1 c 想獲取 lua的 myname 字串的值,所以它把 myname 放到lua 堆疊 棧頂 以便 lua能看到 2 lua從堆疊 棧頂 中獲取 myname 此時棧頂再次...
Lua呼叫C 時列印堆疊資訊
公司的手遊專案,使用的是基於cocos2d x綁lua的解決方案 引數quick x的繫結 雖然使用了lua進行開發,更新很爽了,但是崩潰依然較為嚴重,從後台檢視崩潰日誌時,基本上只能靠 猜 來復現bug。更為鬱悶的是很多時候並沒有使用log輸出,在崩潰日誌裡還無法檢視大概在哪一步操作崩潰的 後來在...