Lua呼叫原理展示(lua的堆疊)

2021-08-19 19:14:27 字數 2372 閱讀 4748

①若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輸出,在崩潰日誌裡還無法檢視大概在哪一步操作崩潰的 後來在...