压入元素

简介: 压入元素

针对每一种能用 C 语言直接表示的 Lua 数据类型, C API 中都有一个对应的压栈函数

  1. 常量nil使用lua_pushnil
  2. 布尔值(在C语言中是整型)使用lua_pushboolean
  3. 双精度浮点数使用lua_pushnumber
  4. 整型使用lua_pushinteger
  5. 任意字符串(一个指向char的指针,外加一个长度)使用lua_pushlstring
  6. \0终止的字符串使用lua_pushstring
void lua_pushnil (lua_State *L);
void lua_pushboolean (lua_State *L, int bool);
void lua_pushnumber (lua_State *L, lua_Number n);
void lua_pushinteger (lua_State *L, lua_Integer n);
void lua_pushlstring (lua_State *L, const char *s, size_t len);
void lua_pushstring (lua_State *L, const char *s);


提示

由于历史原因, C API 中的术语 "number" 指的是双精度浮点类型


当然,也有向栈中压入 C 函数和用户数据的函数,见后续笔记。


类型 lua_Number 相当于 Lua 语言中的浮点数类型,默认为 double ,但可以在编译时配置 Lua ,让 lua_Numberfloat 甚至 long double 。类型 lua_Integer 相当于 Lua 语言中的整型,通常被定义为 long long ,即有符号 64 位整型。同样,要把 Lua 语言中的 lua_Integer 配置为使用 intlong 也很容易。如果使用 float-int 组合,也就是 32浮点型整型,即我们所说的精简Lua ( Small Lua ),对于资源受限的及其和硬件而言,相当高效。


提示

对于这些配置,详见头文件 luaconf.h


Lua 语言中的字符串不是以 \0 结尾的,他们可以包含任意的二进制数据。因此,将字符串压栈的基本函数 lua_pushlstring 需要一个明确的长度作为参数。对于以 \0 结尾的字符串,也可以使用函数 lua_pushstring ,该函数通过 strlen 来计算字符串的长度。 Lua 语言不会保留指向外部字符串(或指向除静态的 C 语言函数外的任何外部对象)的指针。对于不得不保留的字符串, Lua 要么生成一个内部副本,要么复用已有的字符串。因此,一旦上述函数返回,即使立刻释放或修改缓冲区也不会出现问题。

无论何时向栈内压入一个元素,我们都应该确保栈中有足够的空间。当 Lua 启动时,以及 Lua 调用 C 语言时,栈中至少会有 20空闲的位置slot )(头文件 lua.h 中将这个常量定义为 LUA_MINSTACK )。对于大多数情况,这个空间完全够用,所以我们一般无需考虑栈空间的问题。不过,有些任务可能会需要更多的栈空间,特别是循环向栈中压入元素时。在这些情况下,就需要调用函数 lua_checkstack 来检查栈中是否有足够的空间:

int lua_checkstack (lua_State *L, int sz);


这里, sz 是我们所需的额外栈位置的数量。如果可能,函数 lua_checkstack 会增加栈的大小,以容纳所需的额外空间;否则,该函数返回零。


辅助库也提供了一个高层函数来检查栈空间:

void luaL_checkstack(lua_State *L, int sz, const char *msg);


该函数类似于函数 lua_checkstack ,但是如果栈空间不能满足请求,该函数会使用指定的错误信息抛出异常,而不是返回错误码。

目录
相关文章
栈 入栈 出栈 获取栈顶元素
栈 入栈 出栈 获取栈顶元素
160 0
025.寻找相同元素的指针
025.寻找相同元素的指针
73 0
024.寻找指定元素的指针
024.寻找指定元素的指针
68 0
寻找相同元素的指针
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45720029 此实例的要求是在两个已经摆好顺序的数组寻找第一个相同的元素在第一个数组中的指针。
678 0
|
存储 算法 安全
【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)
【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)
1720 0
|
9月前
|
算法 C语言
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
50 0
|
人工智能 机器学习/深度学习
N个数依次入栈,出栈顺序有多少种?
  对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。
1140 0
出栈顺序
      之前参加过华北计算机研究所和优酷土豆的笔试,都考到出栈顺序,之前数据结构学的不到位,遇到这类题时,还着实把我愣了一会,现在总结下,省得以后再遇到这类问题,也希望能给遇到同样问题的兄弟们一个参考。
766 0
|
存储 C++
数据结构(C++语言版)实现顺序栈的创建,初始化,赋值随机数,入栈,出栈,获取栈顶元素,输出
数据结构(C++语言版)实现顺序栈的创建,初始化,赋值随机数,入栈,出栈,获取栈顶元素,输出
456 1
数据结构(C++语言版)实现顺序栈的创建,初始化,赋值随机数,入栈,出栈,获取栈顶元素,输出