压入元素

简介: 压入元素

针对每一种能用 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 ,但是如果栈空间不能满足请求,该函数会使用指定的错误信息抛出异常,而不是返回错误码。

目录
相关文章
|
10月前
最小栈 与 栈的压入、弹出序列
最小栈 与 栈的压入、弹出序列
23 0
最小栈 与 栈的压入、弹出序列
LeetCode——栈的压入、弹出序列
LeetCode——栈的压入、弹出序列
【剑指offer】-栈的压入、弹出序列-20/67
【剑指offer】-栈的压入、弹出序列-20/67
|
2月前
|
存储 索引
如何基于链表与数组实现栈
如何基于链表与数组实现栈
|
9月前
|
存储
【Leetcode】155. 最小栈、JZ31 栈的压入、弹出序列
155. 最小栈 155. 最小栈 题目描述; 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
28 0
剑指offer 30. 栈的压入、弹出序列
剑指offer 30. 栈的压入、弹出序列
41 0
|
存储
栈的介绍以及使用数组模拟栈的入栈和出栈
栈的介绍以及使用数组模拟栈的入栈和出栈
90 0
|
存储 算法 安全
【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)
【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)
1252 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19