Lua C接口API 2

2016-11-29  本文已影响226人  小小小码农

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

前言

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

函数方法

下面针对上面提到的几种数据结构介绍相应的入栈的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。

上一篇 下一篇

猜你喜欢

热点阅读