Lua操作棧c呼叫lua

2021-10-03 10:01:38 字數 2962 閱讀 9866

#include "stdafx.h"

int main()

//得到初始化棧大小

printf( "初始化棧大小:%d\n", lua_gettop( plua ) );

//開啟所有功能庫

lual_openlibs( plua );

//載入指令碼

lual_dofile( plua,"test.lua" );

//將指令碼中的add函式入棧

int ret = lua_getglobal( plua, "add" );

if( 0 == ret )

printf( "棧大小:%d\n", lua_gettop( plua ) );

//函式引數從右到左入棧a = 1, b = 2

lua_pushnumber( plua, 1 );

lua_pushnumber( plua, 2 );

printf( "棧大小:%d\n", lua_gettop( plua ) );

//lua_pcall會呼叫函式並自動清除上面和函式有關的棧

//成功呼叫後會將返回值從右到左入棧

lua_pcall( plua, 2, 3, 0 );

printf( "呼叫函式後棧大小:%d\n", lua_gettop( plua ) );

int sum = lua_tonumber( plua, 1 );

int a = lua_tonumber( plua, 2 );

int b = lua_tonumber( plua, 3 );

printf( "sum:%d a:%d b:%d\n", sum, a, b );

//手動清空所有棧

lua_pop( plua, -1 );//或lua_settop( plua, 0 );

printf( "棧大小:%d\n", lua_gettop( plua ) );

lua_close( plua );

plua = nullptr;

return 0;

}test.lua指令碼:

add = function( a, b )

return a + b, a, b

end輸出結果:

2.lua_gettop()函式

該函式返回當前lua狀態棧的大小

3.lua_push***x()類函式

該函式往棧中新增棧資料

4.lua_pop()函式

該函式表示從當前lua狀態棧中彈出幾個元素

如lua_pop( plua, 2 )表示從棧頂彈出2個元素

當第二個引數填入-1時彈出所有元素即lua_pop( plua, -1 )

5.lua中索引index的表示方法

在使用下面的函式前必須弄懂lua中索引的表示方法

如果我們使用lua_pushnumber依次新增3個數分別1,2,3

則棧的結構為:

[3]    ( 訪問index為:-1 或者 3 )

[2]    ( 訪問index為:-2 或者 2 )

[1]    ( 訪問index為:-3 或者 1 )

也就是說我們要訪問棧頂元素3可以使用-1或者棧大小即可訪問即:

lua_tonumber( plua, -1 ) 和 lua_tonumber( plua, 3 )都是訪問相同的元素

lua_tonumber( plua, -2 ) 和 lua_tonumber( plua, 2 )都是訪問相同的元素

lua_tonumber( plua, -3 ) 和 lua_tonumber( plua, 1 )都是訪問相同的元素

使用負索引從-1開始訪問棧頂後面依次-1即可訪問其他元素

使用正索引從棧大小開始訪問棧頂後面依次-1即可訪問其他元素

6.lua_settop()函式

該函式用來指定哪乙個索引作為棧頂元素

在指定了新的棧頂元素之前的元素都將被移除棧

即棧結構:

[3]    ( 訪問index為:-1 或者 3 )

[2]    ( 訪問index為:-2 或者 2 )

[1]    ( 訪問index為:-3 或者 1 )

我們使用lua_settop( plua, -1 )無變化因為-1這個索引本來就是棧頂索引

使用lua_settop( plua, -2 )即-2這個元素作為新棧頂則以前-1元素值為3的舊棧頂被移除

此時棧結構:

[2]    ( 訪問index為:-1 或者 2 )

[1]    ( 訪問index為:-2 或者 1 )

如果我們一開始就使用lua_settop( plua, -3 )則

棧結構為:

[1]    ( 訪問index為:-1 或者 1 )其他兩個被彈出

特殊情況lua_settop( plua, 0 )移除所有棧元素同lua_pop( plua, -1 )效果一樣

其實lua_pop就是對lua_settop封裝的巨集而已

最後lua_settop使用正或者負索引都是可以的,不建議lua_pop使用負索引, lua_pop( plua, -1 ) 這種

只是特殊情況,因為它的第二個引數按道理應該是個數而不是索引容易發生意想不到的情況

為了加深理解使用下面**自己調整lua_settop來觀察:

lua_pushnumber( plua, 1 );

lua_pushnumber( plua, 2 );

lua_pushnumber( plua, 3 );

lua_settop( plua, 1 );

int a = lua_tonumber( plua, -1 );

int b = lua_tonumber( plua, -2 );

int c = lua_tonumber( plua, -3 );

訪問不存在的元素會返回0

c呼叫 lua 棧操作

打算記錄一些lua api,可能會覺得lua文件中已經說的很清楚了,但是我將用自己的方式,記錄下我認為重要的東西,先約定一下api說明的格式 編號.api作用簡述 api函式原型 api操作說明 返回值說明 對棧的影響 注意事項 1.建乙個新錶 void lua createtable lua st...

lua與C(一) C呼叫lua

lua和c有兩種關係 一種是在lua中呼叫c的函式,c稱為庫 一種是c中呼叫lua,c就稱為應用程式 此時c中包含了lua的直譯器 c 部分 注意在c 中,通常要把lua的一些標頭檔案定義在extern c 中,因為他們是c語言實現的。1.作為應用程式呼叫lua char buffer print ...

Lua與C 呼叫Lua函式(三)

lua允許在乙個文字中定義函式,並且可以通過c語言來呼叫這個函式。先將帶呼叫的函式壓棧,並壓入函式的引數。然後是用lua pcall進行實際呼叫。最後,將呼叫結果從戰中彈出。lua函式 function add x,y return x y end c language double add lua...