Lua编程语言爱好者首页投稿(暂停使用,暂停投稿)

Lua api(七) lua_remove/lua_replac

2016-07-04  本文已影响561人  AlbertS

前言#

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

内容#


lua_remove##


lua_replace##


Usage##

-- 定义一个全局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
    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

结论#

上一篇 下一篇

猜你喜欢

热点阅读