因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况;因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇迁移的文章。

3.5 - 从堆栈中取值

把堆栈中的值转换为指定的C类型,有如下函数可用:

int            lua_toboolean   (lua_State *L, int index);

lua_Number     lua_tonumber    (lua_State *L, int index);

const char    *lua_tostring    (lua_State *L, int index);

size_t         lua_strlen      (lua_State *L, int index);

lua_CFunction  lua_tocfunction (lua_State *L, int index);

void          *lua_touserdata  (lua_State *L, int index);

lua_State     *lua_tothread    (lua_State *L, int index);

void          *lua_topointer   (lua_State *L, int index);

这些函数可通过任意可接受索引调用,如果用无效索引为参数,则和给定值并不匹配类型一样。

lua_toboolean转换指定索引lua值为C“布尔型”值(0或1)。当lua值仅为false或nil时返回0(如果你仅想接受一个真正的布尔值,可以先使用lua_isboolean去测试这个值的类型。

lua_tonumber转换指定索引的值为数字(lua_Number默认为double)。这一lua值必须数字或可转换为数字的字符串(参考2.2.1),否则lua_tonumber返回0。

lua_tostring将指定索引的值转换为字符串(const char*)。lua值必须为字符串或数字,否则返回NULL。当值为数字,lua_tostring将会把堆栈的原值转换为字符串(当lua_tostring应用到键值上时会使lua_next出现难以找出原因的错误)。lua_tostring返回一个完全对齐的字符串指针,这一字符串总是’/0’结尾(和C一样),但可能含有其它的0。如果你不知道一个字符串有多少个0,你可以使用lua_strlen取得真实长度。因为lua有垃圾收集机制,因此不保证返回的字符串指针在对应的值从堆栈中删除后仍然有效。如果你以后还要用到当前函数返回的字符串,你应当备份它或者将它放到registry中(参考3.18)。

lua_tofunction将堆栈中的值转换为C函数指针,这个值必须为C函数指针,否则返回NULL。数据类型lua_CFunction将在3.16节讲述。

lua_tothread转换堆栈中的值为lua线程(以lua_State*为表现形式),此值必须是一个线程,否则返回NULL。

lua_topointer转换堆栈中的值为通用C指针(void*)。这个值必须为userdata、表、线程或函数,否则返回NULL。lua保证同一类型的不同对象返回不同指针。没有直接方法将指针转换为原值,这一函数通常用以获取调试信息。

lua_touserdata在3.8节讲述。

3.6 - 向堆栈压值

下列API能将C值压入堆栈

void lua_pushboolean       (lua_State *L, int b);

void lua_pushnumber        (lua_State *L, lua_Number n);

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

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

void lua_pushnil           (lua_State *L);

void lua_pushcfunction     (lua_State *L, lua_CFunction f);

void lua_pushlightuserdata (lua_State *L, void *p);

这些函数接受一个C值,并将其转换为对应的lua值,然后将其压入堆栈。lua_pushlstring和lua_pushstring对给定的字符串生成一个可以互转的拷贝,这是个例外。lua_pushstring能压C字符串(即以0结尾并且内部没有0),否则建议使用更通用的lua_pushlstring,它能指定长度。

你同样可以压入“格式化”字符串:

const char *lua_pushfstring  (lua_State *L, const char *fmt, ...);

const char *lua_pushvfstring (lua_State *L, const char *fmt, va_list argp);

这两个函数向堆栈压入格式化字符串并返回指向字符串的指针。它们跟sprintf和vsprintf很象但有如下的重要不同:

·你不用申请内存去保存格式化结果,这结果是一个lua字符串并且lua自己会小心管理内存(并通过垃圾收集机制释放)。

·使用转义字符受限。它们没有标志量、宽度和精确度。转义字符能够是’%%’(插入一个”%”)、’%s’(插入一个以0结尾的字符串)、’%f’(插入一个lua_Number)、’%d’(插入一个int)和’%c’(插入一个用int表示的字符)。

函数

void lua_concat (lua_State *L, int n);

用以联结堆栈上部的n个元素,并将它们出栈,将结果放在栈顶。如果n为1,结果为原来的字符串(因为函数什么也没有做);如果n为0,则结果为一个空字符串。联结这一术语依从lua的语义(参考2.5.4)。

Lua manual翻译——第三章第五、六节相关推荐

  1. Lua manual翻译——第三章第一、二节

    因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...

  2. Lua manual翻译——第三章第七、八、九节

    因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...

  3. Lua manual翻译——第三章第三、四节

    因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...

  4. (计算机组成原理)第三章存储系统-第六节4:Cache的写策略(写回法和全写法,写分配法和非写分配法)

    文章目录 一:写命中 (1)写回法(write-back) (2)全写法(write-through) 二:写不命中 (1)写分配法(write-allocate) (2)非写分配法(not-writ ...

  5. (王道考研计算机网络)第三章数据链路层-第六节2:以太网

    指导获取:密码7281 专栏目录首页:[专栏必读]王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记.题目题型总结.注意事项.目录导航和思维导图 王道考研408计算机组成原理万字笔记 ...

  6. (计算机组成原理)第三章存储系统-第六节2:Cache和主存的映射方式(全相联映射、直接映射和组相连映射)

    文章目录 一:全相联映射 二:直接映射 三:组相连映射 前面说过,Cache中实际保存的是主存中的数据副本,所以这里会涉及一个很重要的问题:Cache和主存是如何映射的?所谓映射是指把主存地址空间映射 ...

  7. (计算机组成原理)第三章存储系统-第六节1:高速缓冲存储器Cache及其相关基本概念、程序访问的局部性原理和命中率

    文章目录 一:Cache的基本原理 二:程序访问的局部性原理 三:主存块 四:命中率和缺失率 由于程序的转移概率不会很低,且数据分布的离散性较大,所以单纯依靠并行主存系统提高主存系统的频宽是有限的.这 ...

  8. (王道408考研操作系统)第三章内存管理-第二节3:页面置换算法1

    注意:本节和计组中的Cache替换算法很相似 (计算机组成原理)第三章存储系统-第六节3:Cache替换算法(FIFO,近期最少使用算法-LRU,LFU) 篇幅限制,下一篇请见 点击跳转 文章目录 一 ...

  9. (王道408考研操作系统)第三章内存管理-第二节3:页面置换算法2

    上接: (王道408考研操作系统)第三章内存管理-第二节2:页面置换算法1 文章目录 一:时钟置换算法(CLOCK) (1)简单时钟置换算法 (2)改进型时钟置换算法 二:页面置换算法总结 一:时钟置 ...

最新文章

  1. 使用十六进制色值表示UIColor
  2. BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)
  3. spring AoP学习 -----AoP织入器ProxyFactory剖析
  4. mysql is needed by_libnuma.so.1()(64bit) is needed by mysql-community-server-5.7.9-1.el6.x86_64
  5. The Stable Marriage Problem(POJ-3487)
  6. 什么是php 的精华,在用PHP开发中的精华和技巧总结
  7. VS2012下基于Glut OpenGL显示一些立体图形示例程序:
  8. FFmpeg和WebRTC
  9. php 验证码功能的实现原理,php验证码实现原理
  10. cssmatic gradient css generator,10 Best CSS Gradient Generators
  11. 『Delphi』File not found的解决办法
  12. win10创建html,小米随身WIFI在WIN10下无法创建.htm
  13. Opencv python之车辆识别项目(附代码)
  14. Tcplistener服务端与tcpclient客户端使用
  15. libcef.dll丢失怎么办
  16. 好玩有趣的 iOS URL Scheme
  17. CDA Level1知识点总结之数据分析概述与职业操守
  18. winhex中判断+MBR+DBR+EBR方法
  19. XTU OJ 1309 唯一的子串
  20. linux中cmd是什么文件格式,CMD 文件扩展名: 它是什么以及如何打开它?

热门文章

  1. matlab绘制环形彩色圆盘
  2. nyoj-19-擅长排列的小明
  3. 温州市大学生创业园举行优秀成果展暨投融资对接会
  4. 编程大神都读过的10本经典神书,找到了
  5. 当数据库中存在某个表的年龄大于vacuum_freeze_table_age,就会执行急切冻结过程
  6. 【论文笔记】Slimmer: Weight Loss Secrets for Docker Registries
  7. lbi php,ecshop不能在模板文件.dwt和.lbi中直接添加php代碼的解決方法
  8. 计算机报名qq登录用户名或密码错误,登录电脑微信显示账号或密码错误怎么办...
  9. 【技术】天洑数据建模实施案例集锦(2) - 燃料电池热管理快速评估
  10. html点击按钮文件上传,js点击按钮实现文件上传