c++ 与 lua 简单交互参数介绍
原文http://blog.csdn.net/johnice/article/details/5517431
一、第一个例子 Hello World !
- #include <stdio.h>
- #include <string.h>
- #include "lua.h"
- #include "lauxlib.h"
- #include "lualib.h"
- int main (void)
- {
- char buff[256];
- int error;
- lua_State *L = lua_open(); /* opens Lua */
- // 5.1.4 版本加载库 方法
- luaL_openlibs(L);
- // 5.1.4 版本之前 加载库 方式
- //luaopen_base(L); /* opens the basic library */
- //luaopen_table(L); /* opens the table library */
- //luaopen_io(L); /* opens the I/O library */
- //luaopen_string(L); /* opens the string lib. */
- //luaopen_math(L); /* opens the math lib. */
- while (fgets(buff, sizeof(buff), stdin) != NULL) {
- error = luaL_loadbuffer(L, buff, strlen(buff),
- "line") || lua_pcall(L, 0, 0, 0);
- if (error) {
- fprintf(stderr, "%s", lua_tostring(L, -1));
- lua_pop(L, 1);/* pop error message from the stack */
- }
- }
- lua_close(L);
- return 0;
- }
注意一下几点:
1.需要lua库的 .dll 和 .lib 文件
2.在include “lua.h lauxlib.h lualib.h” 时,注意区分是否需要将这些include用 extern "C" { ... } 包含起来
3.初始化lua虚拟机函数已改成 luaL_openlibs(L);
二、堆栈
2.1:压入元素
将每种可以用C 来描述的Lua 类型压栈
- void lua_pushnil (lua_State *L);
- void lua_pushboolean (lua_State *L, int bool);
- void lua_pushnumber (lua_State *L, double n);
- void lua_pushlstring (lua_State *L, const char *s, size_t length);
- void lua_pushstring (lua_State *L, const char *s);
将字符串压入串的正式函数是lua_pushlstring,它要求一个明确的长度作为参数。对于以零结束的字符串,你可以用lua_pushstring
2.2:查询元素
各个类型的这些函数都有同一个原型: int lua_is... (lua_State *L, int index);
这些函数中使用 lua_type, 并对结果(几种宏)进行判断,返回0 or 1
- #define LUA_TNIL 0
- #define LUA_TBOOLEAN 1
- #define LUA_TLIGHTUSERDATA 2
- #define LUA_TNUMBER 3
- #define LUA_TSTRING 4
- #define LUA_TTABLE 5
- #define LUA_TFUNCTION 6
- #define LUA_TUSERDATA 7
- #define LUA_TTHREAD 8
2.3:从栈中获取值,lua_to... ()函数:
- int lua_toboolean (lua_State *L, int index);
- double 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_toboolean、lua_tonumber 和lua_strlen 返回0,其他函数返回NULL。
lua 允许 string 中包含'/0',所以下面的语句总是有效的:
- const char *s = lua_tostring(L, -1); /* any Lua string */
- size_t l = lua_strlen(L, -1); /* its length */
- assert(s[l] == '/0');
- assert(strlen(s) <= l);
2.4:其他堆栈操作
- int lua_gettop (lua_State *L);
- void lua_settop (lua_State *L, int index);
- void lua_pushvalue (lua_State *L, int 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);
lua_gettop:返回堆栈中的元素个数,它也是栈顶元素的索引(注意一个负数索引-x 对应于正数索引gettop-x+1)
lua_settop:设置栈顶(也就是堆栈中的元素个数)为一个指定的值
如果开始的栈顶高于新的栈顶,顶部的值被丢弃。否则,为了得到指定的大小这个函数压入相应个数的空值(nil)到栈上
lua_settop(L,0); 清空堆栈
也可以用负数索引作为调用lua_settop 的参数,那将会设置栈顶到指定的索引。利用这种技巧,API 提供了下面这个宏,它从堆栈中弹出n 个元素:
#define lua_pop(L,n) lua_settop(L, -(n)-1)
lua_pushvalue:压入堆栈上指定索引的一个抟贝到栈顶
lua_remove:移除指定索引位置的元素,并将其上面所有的元素下移来填补这个位置的空白
lua_insert:移动栈顶元素到指定索引的位置,并将这个索引位置上面的元素全部上移至栈顶被移动留下的空隔;
lua_replace 从栈顶弹出元素值并将其设置到指定索引位置,没有任何移动操作。
2.5:表操作
lua_getglobal:其中一参数为变量名称,每调用一次就把相应的变量值压入栈顶
lua_gettable:他接受table在栈中的位置为参数,调用前需要先将要取的key(string)压入栈,并位于栈顶,
调用lua_gettable 后对应key 值出栈,返回与key 对应的value(栈顶)
lua_newtable:创建一个新的空table 然后将其入栈
lua_settable:以table 在栈中的索引作为参数(key先入栈,value后(顶)),并将栈中的key 和value出栈,用这两个值修改table的相应key值。
lua_setglobal:将栈顶元素出栈,并将其赋给一个全局变量名
- void setfield (const char *index, int value) {
- lua_pushstring(L, index);
- lua_pushnumber(L, (double)value/MAX_COLOR);
- lua_settable(L, -3);
- }
- void setcolor (struct ColorTable *ct) {
- lua_newtable(L); /* creates a table */
- setfield("r", ct->red); /* table.r = ct->r */
- setfield("g", ct->green); /* table.g = ct->g */
- setfield("b", ct->blue); /* table.b = ct->b */
- lua_setglobal(ct->name); /* 'name' = table */
- }
c++ 与 lua 简单交互参数介绍的更多相关文章
- cocos2d-x lua与c++简单交互
cocos2d-x lua与c++简单交互 version: cocos2d-x 3.6 本文讲述lua与c++的一些简单交互: lua通过消息方式调用c++无参接口 c++调用lua带参接口 1.通 ...
- Linux系统IO分析工具之iotop常用参数介绍
Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...
- nc命令的常用参数介绍
nc命令的常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必做运维的应该在网络安全上都对一些开源软件都应该是相当的了解吧,比如tcpdump,namp等神奇,今天要给 ...
- Linux操作系统的文件查找工具locate和find命令常用参数介绍
Linux操作系统的文件查找工具locate和find命令常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.非实时查找(数据库查找)locate工具 locate命 ...
- 2020年的UWP(3)——UWP和desktop extension的简单交互
上一篇<2020年的UWP(2)--In Process App Service>中我们了解了UWP和Desktop Extension可以通过AppService进行数据交互.本篇我们就 ...
- Lua C++交互 应用实例步骤(UserData使用)
一.配置Lua C++交互环境 1.下载Lua 包环境 地址: https://www.lua.org/download.html ,我们这里用的是5.4.2版本. 2.新建C++ 控制台应用程序 3 ...
- SQLMAP参数介绍
转自:http://zhan.renren.com/bugpower?gid=3602888498044629629&checked=true SQLMAP参数介绍 sqlmap的使用方式:p ...
- G++ 参数介绍(转载)
g++参数介绍 From: http://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html gcc and g++分别是gnu的c & ...
- pentaho cde 画图参数介绍
初步接触pentaho,由于在国内的资料很少,唯有看英文文档,做了N次反复尝试,挖掘了pentaho CDE中画图的一些基本参数. 下面就列出来了一些常用参数介绍: crosstabMode:表明如果 ...
随机推荐
- 如果看看机器ip和域名ip
1.如果查看一个机器IP ifconfig或hostname -i //linux ipconfig //windows 2.查看一个域名对应ip ping www.baidu.com 下面会显示域名 ...
- Windows 10 Certified with Oracle E-Business Suite
Microsoft Windows 10 (32-bit and 64-bit) is certified as a desktop client operating system for end-u ...
- 20180403_调bug_大地保险_jar包冲突
一.异常现象 他们程序在本地通过java形式直接跑起来的时候,是正常的. 但是测试服务器上,程序跑到一半就不继续往下走了,而且,也不报错,日志里面没有任何信息. 二.异常解决 1.核心思想 抽丝剥茧, ...
- idea下建立bootstrap项目
环境准备: 1.创建一个static web名为bootstrapDemo 2.在bootstrapDemo文件夹下安装bower npm install bower 会自动产生node-module ...
- HihoCoder1465 重复旋律8(后缀自动机)
描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi发现旋律可以循环,每次把一段旋律里面最前面一个音换到最后面就成为了原旋律的“循环相似旋律”,还可以 ...
- [转]AngularJS 之 Factory vs Service vs Provider
地址: http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider
- Python 算法之冒泡排序
冒泡排序 冒泡排序算法的原理如下:(从后往前) 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是 ...
- win32 获取本机网卡信息(MAC地址,IP地址等)
由于一个需求需要获取网卡的MAC地址,就搜了一下,大部分都是COPY来COPY去的一些代码,有很多甚至不能直接运行或有还有内存泄漏.自己查了一下MSDN然后封装了一下: 需要注意,一个机器可能有多个网 ...
- 运行flask程序
Command Line Interface Installing Flask installs the flask script, a Click command line interface, i ...
- Azure基于角色的用户接入控制(RBAC)
RBAC是Role Based Access Control是基于角色的接入控制的简称.在Azure推出ARM以后,对Azure各种资源的管理粒度已经非常细致,使得RBAC成为可能. 通过RBAC可以 ...