提到C++与lua互调,不可不提栈。

栈是C++和Lua相互通讯的一个地方。

首先这个栈并不是传统意义上的栈(传统的栈需要放同一种数据类型,但在网上的某些资料说,每个栈元素是一个联合体)。

栈从上向下分别是-1,-2,-3... ; 从下向上分别是1,2,3...

这也就是lua_gettop为什么可以获得栈中总元素数的原因。因为lua_gettop()获得的是从下向上栈顶的索引,因为从1开始,栈顶的索引也即是总元素数。

1.

lua_getglobal(L,“lua变量名");

这个函数会将lua中的某变量放置到栈顶,于是C++就可以取了。

2.

lua_tointeger(L, "某索引")

将某索引的栈中元素取得(并不出栈),索引可为正或者负。

同系列的还有lua_toboolean,lua_tostring等。

3.

lua_call(L,参数个数,返回值个数)

在调用之前,要将函数名,各个参数,分别入栈。

4.

lua_register

将某C函数注册(建立与lua函数的关联关系 )

可以想象内部有一个map<string(lua函数名) ,C函数指针>

要注意 函数的返回值要是int ,参数要是lua_State*

查看lua_CFunction的定义,就明白为什么了。

5.打印整个栈

这个是很重要的一个技巧,尤其在初学阶段。

我就曾经被网上一段错误代码弄的百思不得其解,后来通过打印栈的方式,明白他写的是错的。

而且通过打印栈我还发现,调用luaopen_base(L)系列函数时,每调用一个,会在栈中push一个table

这也就是为什么说lua所有变量,函数(函数其实也是变量),

都在lua_State中的原因。

//该函数来自网络
void stackDump(lua_State* L)
{
int i;
int top = lua_gettop(L);
printf("stackDump(num=%d):\n",top); for (i = ; i <= top; i++) { /* repeat for each level */
int t = lua_type(L, i);
switch (t) { case LUA_TSTRING: /* strings */
printf("`%s'", lua_tostring(L, i));
break; case LUA_TBOOLEAN: /* booleans */
printf(lua_toboolean(L, i) ? "true" : "false");
break; case LUA_TNUMBER: /* numbers */
printf("%g", lua_tonumber(L, i));
break; default: /* other values */
printf("%s", lua_typename(L, t));
break; }
printf(" "); /* put a separator */
}
printf("\n"); /* end the listing */ }

Lua 栈的理解的更多相关文章

  1. 栈的理解以及如何计算程序所需栈的大小并在IAR中设置栈

    文章首发于浩瀚先森博客 #栈的理解 一个程序大体上讲都是由变量和函数组合而成,变量有全局变量和局部变量,还有函数间传值的参数以及返回值. Stack是为了程序运行过程中临时保存所需数据而在内存里分配的 ...

  2. 堆&栈的理解(转)

    (摘自:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html) C++中堆和栈的理解 内存分配方面: 堆: 操作系统有一个记录空闲内 ...

  3. 通过lua栈了解lua与c的交互

    lua是如何执行的 其中分析.执行部分都是c语言实现的. lua与c的关系 lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈 ...

  4. lua栈

    既然Lua虚拟机模拟的是CPU的运作,那么Lua栈模拟的就是内存的角色.在Lua内部,参数的传递是通过Lua栈,同时Lua与C等外部进行交互的时候也是使用的栈.,先关注的是Lua栈的分配,管理和相关的 ...

  5. lua和C++交互的lua栈操作——以LuaTinker为例

    一. -- C++类注册函数(LuaTinker) 的lua栈操作: -- lua栈内容(执行到pop语句) 栈地址 <--执行语句 space_name[name] = t1 -- (2b8) ...

  6. Lua 栈中元素的位置

    Lua与C.C#等的交互是通过栈来实现的,每次插入元素都是放在栈顶(top),至于元素的index,可以使用正数和负数两种方式, 如取栈底开始至第index个元素 -index = gettop - ...

  7. c调用 lua 栈操作

    转自https://www.cnblogs.com/ringofthec/archive/2010/10/22/lua.html 打算记录一些lua_api, 可能会觉得lua文档中已经说的很清楚了, ...

  8. 【转载】iOS堆和栈的理解

    操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme ...

  9. Struts2 中的值栈的理解

    通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求 道服务器端 action时,就有个堆栈,如果action在服务器端 ...

随机推荐

  1. SOCKS 5协议详解(转)

    笔者在实际学习中,由于在有些软件用到了socks5(如oicq,icq等),对其原理不甚了解,相信很多朋友对其也不是很了解,于是仔细研读了一下rfc1928,觉得有必要译出来供大家参考. 1.介绍: ...

  2. mysql 计算日期差

    有两个途径可获得   1.利用TO_DAYS函数   select to_days(now()) - to_days('20140831')   2.利用DATEDIFF函数   select dat ...

  3. Linux centOS下搭建RTMP服务器的具体步骤

    以下的所需的安装包,可直接在linux系统终端下载,也可从其他地方下载之后拷到对应目录下解压使用,遇到连接不到国外网站时可改变压缩包地址 1.安装依赖包: #yum install glibc.i68 ...

  4. java web(spring mvc) 获取请求host 和 如何获取静态页的相对路径

    1.获取请求host StringBuffer url = request.getRequestURL(); String tempContextUrl = url.delete(url.length ...

  5. sql一对多的两个表的update

    scie_apprecord仪器表   和   scie_apporder仪器预约时间表 ,一个仪器可以有多条预约时间. 仪器表: 预约时间表: 需求: 由于一个仪器有好多条预约记录,将预约时间表的最 ...

  6. js和php对bool值的判断区别

    一.将一种数据类型转换为bool值时,PHP和JS的转换规则不同 PHP中 当转换为 boolean 时,以下值被认为是 FALSE : 布尔值 FALSE 本身 整型值 0(零) 浮点型值 0.0( ...

  7. UNIX 系统调用函数errno返回值搜集(in updating )

    当Unix系统级函数遇到错误时,它们会典型地返回-1,并设置全局整数变量errno来表示什么出错了 阅读redis源码的时候,发现如果对系统级函数出错时的errno比较熟悉,写起程序来会游刃有余不少. ...

  8. Iscroll解析

    做了一些移动端的产品,发现一些滚动效果很多会使用 iscroll 作为底层库(如阿里小蜜).iscroll 的文档已经好久没更新了,而且比较简单,经常需要直接读源码.这里写一篇总结,作为对 iscro ...

  9. aa12

    option = { backgroundColor: '#1b1b1b', color: ['gold','aqua','lime'], title : { text: '模拟迁徙', subtex ...

  10. linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)

    linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl) 分类: linux2011-10-10 13:21 8773人阅读 评论(1) 收藏 举 ...