Lua api(七) lua_remove/lua_replace

前言#

初步了解過(guò)lua的人都知道尔当,lua和c交互式通過(guò)虛擬棧來(lái)實(shí)現(xiàn)的,這個(gè)棧造就了lua的神奇,那么我們今天來(lái)看看怎樣直接操作這個(gè)虛擬棧吉殃,首先我們要知道c調(diào)用lua和函數(shù)是通過(guò)和struct lua_State相關(guān)的棧來(lái)交換數(shù)據(jù)的密似,而Lua 調(diào)用C函數(shù)用的棧是臨時(shí)的焙矛,調(diào)用結(jié)束之后就被銷(xiāo)毀了。我們下面要講的是c調(diào)用lua的棧残腌,我們可以通過(guò)特定的api來(lái)改變棧內(nèi)數(shù)據(jù)村斟。

內(nèi)容#


lua_remove##

  • 原型:void lua_remove (lua_State *L, int index);
  • 解釋?zhuān)?從給定有效索引處移除一個(gè)元素, 把這個(gè)索引之上的所有元素移下來(lái)填補(bǔ)上這個(gè)空隙抛猫。

lua_replace##

  • 原型:void lua_replace (lua_State *L, int index);
  • 解釋?zhuān)喊褩m斣匾苿?dòng)到給定位置(并且把這個(gè)棧頂元素彈出)蟆盹, 不移動(dòng)任何元素(因此在那個(gè)位置處的值被覆蓋掉)。

Usage##

  • 首先我們先新建一個(gè)文件闺金,文件命名為removetest.lua編寫(xiě)如下代碼:
-- 定義一個(gè)全局table
LanguagesTable = 
{
    "lua",
    "c",
    "c++",
    "java",
    "python",
}

-- 定義一個(gè)打印函數(shù)
function func_printarray()
    for index,value in pairs(LanguagesTable) do
        print("lua --> ["..index.."] = ".. value);
    end
    print("\n");
end
  • 接下來(lái)我們來(lái)編寫(xiě)c++調(diào)用的函數(shù)的代碼如下:
    lua_State *L = lua_open();
    luaL_openlibs(L);

    luaL_dofile(L,"removetest.lua");    // 加載執(zhí)行l(wèi)ua文件
    lua_getglobal(L, "func_printarray");// 打印一下table的內(nèi)容
    lua_pcall(L, 0, 0, 0);              // 調(diào)用函數(shù)

    lua_getglobal(L,"LanguagesTable");  // 將全局表壓入棧

    // 記錄壓棧前元素個(gè)數(shù)
    const int nPreStack = lua_gettop(L);

    // 將數(shù)組元素入棧
    for(int nIndex = 1; nIndex <= 5; ++nIndex)
    {
        lua_rawgeti(L, -1 * nIndex, nIndex);
    }
    
    // 替換元素逾滥,使用棧頂元素替換棧頂向下第3個(gè)元素
    lua_replace(L, -3);                 // -->lua_replace用法

    // 刪除元素,刪除棧頂元素
    lua_remove(L, -1);                  // -->lua_remove用法

    // 查詢(xún)當(dāng)前棧中元素個(gè)數(shù)
    const int nCurStack = lua_gettop(L);

    // 打印棧中元素
    for(int nIndex = nPreStack + 1; nIndex <= nCurStack; ++nIndex)
    {
        printf("c++ --> stack pos %d : val = %s\n", nIndex, lua_tostring(L, nIndex));
    }

    lua_close(L);                       //關(guān)閉lua環(huán)境  
  • 結(jié)果
remove.png

結(jié)論#

  • 不能用偽索引來(lái)調(diào)用lua_remove這個(gè)函數(shù)掖看, 因?yàn)閭嗡饕⒉恢赶蛘鎸?shí)的棧上的位置匣距。
  • 通過(guò)結(jié)果我們來(lái)分析一下最后的打印順序,開(kāi)始時(shí)我們將左右元素壓入棧中哎壳,“l(fā)ua”在棧底毅待,“python”在棧頂,執(zhí)行l(wèi)ua_replace(L, -3)后“python”將“c++”替換归榕,然后棧頂?shù)摹皃ython”被彈出尸红,然后執(zhí)行l(wèi)ua_remove(L, -1)后棧頂?shù)摹癹ava”被彈出,結(jié)果借得到了“l(fā)ua”刹泄、“c”外里、“python”的順序。
  • 讀取table的內(nèi)容時(shí)一定要確保table已經(jīng)被加載到棧中特石,我在調(diào)試的時(shí)候就有好幾次因?yàn)樽x取了錯(cuò)誤的文件盅蝗,結(jié)果沒(méi)有把正確的table加載到棧中,而導(dǎo)致了程序的崩潰姆蘸。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末墩莫,一起剝皮案震驚了整個(gè)濱河市芙委,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狂秦,老刑警劉巖灌侣,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異裂问,居然都是意外死亡侧啼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)堪簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痊乾,“玉大人,你說(shuō)我怎么就攤上這事椭更》龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵甜孤,是天一觀的道長(zhǎng)协饲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缴川,這世上最難降的妖魔是什么茉稠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮把夸,結(jié)果婚禮上而线,老公的妹妹穿的比我還像新娘。我一直安慰自己恋日,他們只是感情好膀篮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著岂膳,像睡著了一般誓竿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谈截,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天筷屡,我揣著相機(jī)與錄音,去河邊找鬼簸喂。 笑死毙死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喻鳄。 我是一名探鬼主播扼倘,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼除呵!你這毒婦竟也來(lái)了再菊?” 一聲冷哼從身側(cè)響起隅肥,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袄简,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泛啸,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绿语,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了候址。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吕粹。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岗仑,靈堂內(nèi)的尸體忽然破棺而出匹耕,到底是詐尸還是另有隱情,我是刑警寧澤荠雕,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布稳其,位于F島的核電站,受9級(jí)特大地震影響炸卑,放射性物質(zhì)發(fā)生泄漏既鞠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一盖文、第九天 我趴在偏房一處隱蔽的房頂上張望嘱蛋。 院中可真熱鬧,春花似錦五续、人聲如沸洒敏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凶伙。三九已至,卻和暖如春它碎,著一層夾襖步出監(jiān)牢的瞬間镊靴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工链韭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偏竟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓敞峭,卻偏偏與公主長(zhǎng)得像踊谋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旋讹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 當(dāng)在Lua和C之間交換數(shù)據(jù)時(shí)主要的問(wèn)題是自動(dòng)回收與手動(dòng)回收內(nèi)存管理的不一致殖蚕。因此轿衔,Lua 用一個(gè)抽象的棧在Lua與...
    luffier閱讀 2,632評(píng)論 0 3
  • C API 云風(fēng)Blog:Lua C API 的正確用法 C讀取和調(diào)用Lua文件的庫(kù):lua.h, lauxlib...
    SysuYe閱讀 5,631評(píng)論 2 10
  • 第一篇 語(yǔ)言 第0章 序言 Lua僅讓你用少量的代碼解決關(guān)鍵問(wèn)題。 Lua所提供的機(jī)制是C不擅長(zhǎng)的:高級(jí)語(yǔ)言睦疫,動(dòng)態(tài)...
    testfor閱讀 2,651評(píng)論 1 7
  • lua作為小巧精悍的腳本語(yǔ)言害驹,易于嵌入c/c++中 , 廣泛應(yīng)用于游戲AI 蛤育,實(shí)際上在任何經(jīng)常變化的邏輯上都可以使...
    木易林1閱讀 1,499評(píng)論 0 4
  • 這句話特別我早就聽(tīng)過(guò)了宛官,只是當(dāng)紫雨老師從新講出來(lái)的時(shí)候,我突然感覺(jué)特別震撼瓦糕,是啊底洗,其實(shí)世界上真的只有兩種人,一種是...
    白色的小草閱讀 434評(píng)論 0 0