Lua api(七) lua_remove/lua_replace

前言#

初步了解过lua的人都知道,lua和c交互式通过虚拟栈来实现的,这个栈造就了lua的神奇,那么我们今天来看看怎样直接操作这个虚拟栈,首先我们要知道c调用lua和函数是通过和struct lua_State相关的栈来交换数据的,而Lua 调用C函数用的栈是临时的,调用结束之后就被销毁了。我们下面要讲的是c调用lua的栈,我们可以通过特定的api来改变栈内数据。

内容#


lua_remove##

  • 原型:void lua_remove (lua_State *L, int index);
  • 解释: 从给定有效索引处移除一个元素, 把这个索引之上的所有元素移下来填补上这个空隙。

lua_replace##

  • 原型:void lua_replace (lua_State *L, int index);
  • 解释:把栈顶元素移动到给定位置(并且把这个栈顶元素弹出), 不移动任何元素(因此在那个位置处的值被覆盖掉)。

Usage##

  • 首先我们先新建一个文件,文件命名为removetest.lua编写如下代码:
-- 定义一个全局table
LanguagesTable = 
{
    "lua",
    "c",
    "c++",
    "java",
    "python",
}

-- 定义一个打印函数
function func_printarray()
    for index,value in pairs(LanguagesTable) do
        print("lua --> ["..index.."] = ".. value);
    end
    print("\n");
end
  • 接下来我们来编写c++调用的函数的代码如下:
    lua_State *L = lua_open();
    luaL_openlibs(L);

    luaL_dofile(L,"removetest.lua");    // 加载执行lua文件
    lua_getglobal(L, "func_printarray");// 打印一下table的内容
    lua_pcall(L, 0, 0, 0);              // 调用函数

    lua_getglobal(L,"LanguagesTable");  // 将全局表压入栈

    // 记录压栈前元素个数
    const int nPreStack = lua_gettop(L);

    // 将数组元素入栈
    for(int nIndex = 1; nIndex <= 5; ++nIndex)
    {
        lua_rawgeti(L, -1 * nIndex, nIndex);
    }
    
    // 替换元素,使用栈顶元素替换栈顶向下第3个元素
    lua_replace(L, -3);                 // -->lua_replace用法

    // 删除元素,删除栈顶元素
    lua_remove(L, -1);                  // -->lua_remove用法

    // 查询当前栈中元素个数
    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);                       //关闭lua环境  
  • 结果
remove.png

结论#

  • 不能用伪索引来调用lua_remove这个函数, 因为伪索引并不指向真实的栈上的位置。
  • 通过结果我们来分析一下最后的打印顺序,开始时我们将左右元素压入栈中,“lua”在栈底,“python”在栈顶,执行lua_replace(L, -3)后“python”将“c++”替换,然后栈顶的“python”被弹出,然后执行lua_remove(L, -1)后栈顶的“java”被弹出,结果借得到了“lua”、“c”、“python”的顺序。
  • 读取table的内容时一定要确保table已经被加载到栈中,我在调试的时候就有好几次因为读取了错误的文件,结果没有把正确的table加载到栈中,而导致了程序的崩溃。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 当在Lua和C之间交换数据时主要的问题是自动回收与手动回收内存管理的不一致。因此,Lua 用一个抽象的栈在Lua与...
    luffier阅读 2,628评论 0 3
  • C API 云风Blog:Lua C API 的正确用法 C读取和调用Lua文件的库:lua.h, lauxlib...
    SysuYe阅读 5,629评论 2 10
  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,642评论 1 7
  • lua作为小巧精悍的脚本语言,易于嵌入c/c++中 , 广泛应用于游戏AI ,实际上在任何经常变化的逻辑上都可以使...
    木易林1阅读 1,498评论 0 4
  • 这句话特别我早就听过了,只是当紫雨老师从新讲出来的时候,我突然感觉特别震撼,是啊,其实世界上真的只有两种人,一种是...
    白色的小草阅读 431评论 0 0