美文网首页
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

    前面学习了如何使用LuaApi操作虚拟栈的栈顶操作,但是仍旧不清楚如何操作栈中的数据,如何获取数据,如何操作数据等...

  • Lua C接口API 3

    Lua C 接口 API 接口比较多,主要都是围绕交互栈的操作,前面学习了如何简单操作交互栈,且相应的API比较...

  • Lua C API

    C API 云风Blog:Lua C API 的正确用法 C读取和调用Lua文件的库:lua.h, lauxlib...

  • Lua C接口API 4

    前面介绍了当lua文件做配置使用时,该如何使用 API 接口去获取配置文件信息, lua 文件作为配置文件使用还是...

  • Lua C接口API 1

    最近工作中用到了Lua作为脚本语言由C/C++宿主语言调用,因为之前没用了解过Lua,在使用过程中遇到不少不懂得地...

  • LUA API 参考

    lapi.c和lauxlib.c里包含了大部分的lua的capi。所谓capi是指在c形式的api接口,可以在c/...

  • C++调用lua方式

    目标 使用C++调用lua接口 示例 lua代码(test.lua) C++调用示例(lua_test.cpp) ...

  • LuaC API

    Lua C APi 总结 Lua_newtable(L) 创建table并放到栈顶 lua_pushstring(...

  • tolua

    Using Lua API and tag method facilities, tolua maps C/C++...

  • lua_newstate

    version 5.3.5 1、lua_newstate是由lstate.c提供的lua内部函数,由LUA_API...

网友评论

      本文标题: Lua C接口API 2

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