美文网首页
Lua C接口API 2

Lua C接口API 2

作者: 小小小码农 | 来源:发表于2016-11-29 21:30 被阅读226次

    前面学习了如何使用LuaApi操作虚拟栈的栈顶操作,但是仍旧不清楚如何操作栈中的数据,如何获取数据,如何操作数据等等。本文将介绍如何向栈中压入数据。

    前言

    Lua栈中压入数据,首先得知道Lua中有哪一些数据类型,每种数据类型提供了哪些方式入栈。
    Lua提供了以下几种常用数据类型:

    • nil:Nil是nil类型,用来表示一个有意义的值不存在时的状态
    • boolean:false与true两个值得类型
    • number:代表整数与浮点数
    • string:表示一个不可变的字节序列,可以包含('\0')
      Lua中还有一些其它数据类型比如functionuserdatathreadtable,不在本文介绍,有机会将在后续介绍。

    函数方法

    下面针对上面提到的几种数据结构介绍相应的入栈的API

    nil 入栈

    void lua_pushnil (lua_State *L);
    

    作用:顾名思义,将空值入栈

    boolean 入栈

    void lua_pushboolean (lua_State *L, int b);
    

    作用:将b作为一个布尔量入栈

    number 入栈

    void lua_pushnumber (lua_State *L, lua_Number n);
    

    作用:将一个值为n的浮点数入栈

    string 入栈

    const char *lua_pushlstring (lua_State *L, const char *s, size_t len);
    

    作用:把指针s指向长度为len的字符串压栈。Lua会对这个字符串做一个副本,因此s可以在函数返回后释放或作其他用,函数返回字符串的副本

    const char *lua_pushstring (lua_State *L, const char *s);
    

    作用:将指针s指向的零结尾的字符串压栈。 因此s处的内存在函数返回后,可以释放掉或是立刻重用于其它用途。返回字符串的副本。

    其他入栈方式

    void lua_pushvalue (lua_State *L, int index);
    

    作用:把栈上给定索引处的元素作一个副本压栈,等于拷贝index处的元素入栈

    void lua_remove (lua_State *L, int index);
    

    作用:移除指定索引的元素,并将其上面所有的元素下移来填补这个位置的空白。

    void lua_insert (lua_State *L, int index);
    

    作用:移动栈顶元素到指定索引的位置,并将这个索引位置上面的元素全部上移至栈顶被移动留下的空隔。

    void lua_replace (lua_State *L, int index);
    

    作用:从栈顶弹出元素值并将其设置到指定索引位置,没有任何移动操作。

    示例

    C 使用 Lua API

    /*
     * gcc test.c -llua -lm -ldl
     */
    
    
    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>
    #include <stdio.h>
    
    
    /*
     * 从栈底到栈顶依次遍历整个堆栈
     */
    static void stackDump(lua_State* L)
    {
        int i;
        int top = lua_gettop(L);
        for(i = 1; i <= top; ++i)
        {
            int t = lua_type(L, i);
            switch(t)
            {
            case LUA_TSTRING:
                printf("'%s'", lua_tostring(L, i));
                break;
            case LUA_TBOOLEAN:
                printf(lua_toboolean(L, i) ? "true": "false");
                break;
            case LUA_TNUMBER:
                printf("'%g'", lua_tonumber(L, i));
                break;
            default:
                printf("'%s'", lua_typename(L, t));
                break;
            }
            printf("   ");
    
        }
        printf("\n");
    
    }
    
    int main(int argc, char *argv[])
    {
        lua_State *L = lua_open();
        luaL_openlibs(L);
    
        lua_pushboolean(L, 1);
        lua_pushnumber(L, 10);
        lua_pushnil(L);
        lua_pushstring(L, "Hello");
        lua_pushlstring(L, "World!!!", 6);
    
        stackDump(L);
    
        lua_pushvalue(L, -4);
        stackDump(L);
    
        lua_remove(L, 3);
        stackDump(L);
    
        lua_insert(L, -2);
        stackDump(L);
    
        lua_replace(L, 1);
        stackDump(L);
    
    
        lua_close(L);
    
        return 0;
    }
    

    编译执行输出为:

    true '10' 'nil' 'Hello' 'World!'
    true '10' 'nil' 'Hello' 'World!' '10'
    true '10' 'Hello' 'World!' '10'
    true '10' 'Hello' '10' 'World!'
    'World!' '10' 'Hello' '10'

    总结

    Lua栈操看起来并不复杂,用好就见仁见智了,下一篇文章将介绍,获取栈中数据的API。

    相关文章

      网友评论

          本文标题: Lua C接口API 2

          本文链接:https://www.haomeiwen.com/subject/uyjzpttx.html