c++ 与 lua 简单交互参数介绍

原文http://blog.csdn.net/johnice/article/details/5517431

一、第一个例子 Hello World !

[c-sharp] view plain copy

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "lua.h"
  4. #include "lauxlib.h"
  5. #include "lualib.h"
  6. int main (void)
  7. {
  8. char buff[256];
  9. int error;
  10. lua_State *L = lua_open(); /* opens Lua */
  11. // 5.1.4 版本加载库 方法
  12. luaL_openlibs(L);
  13. // 5.1.4 版本之前 加载库 方式
  14. //luaopen_base(L); /* opens the basic library */
  15. //luaopen_table(L); /* opens the table library */
  16. //luaopen_io(L); /* opens the I/O library */
  17. //luaopen_string(L); /* opens the string lib. */
  18. //luaopen_math(L); /* opens the math lib. */
  19. while (fgets(buff, sizeof(buff), stdin) != NULL) {
  20. error = luaL_loadbuffer(L, buff, strlen(buff),
  21. "line") || lua_pcall(L, 0, 0, 0);
  22. if (error) {
  23. fprintf(stderr, "%s", lua_tostring(L, -1));
  24. lua_pop(L, 1);/* pop error message from the stack */
  25. }
  26. }
  27. lua_close(L);
  28. return 0;
  29. }

注意一下几点:

1.需要lua库的 .dll 和 .lib 文件

2.在include “lua.h lauxlib.h lualib.h” 时,注意区分是否需要将这些include用 extern "C" { ... } 包含起来

3.初始化lua虚拟机函数已改成  luaL_openlibs(L);

二、堆栈

2.1:压入元素

将每种可以用C 来描述的Lua 类型压栈

[c-sharp] view plain copy

  1. void lua_pushnil (lua_State *L);
  2. void lua_pushboolean (lua_State *L, int bool);
  3. void lua_pushnumber (lua_State *L, double n);
  4. void lua_pushlstring (lua_State *L, const char *s, size_t length);
  5. 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

[c-sharp] view plain copy

  1. #define LUA_TNIL        0
  2. #define LUA_TBOOLEAN        1
  3. #define LUA_TLIGHTUSERDATA  2
  4. #define LUA_TNUMBER     3
  5. #define LUA_TSTRING     4
  6. #define LUA_TTABLE      5
  7. #define LUA_TFUNCTION       6
  8. #define LUA_TUSERDATA       7
  9. #define LUA_TTHREAD     8

2.3:从栈中获取值,lua_to... ()函数:

[c-sharp] view plain copy

  1. int lua_toboolean (lua_State *L, int index);
  2. double lua_tonumber (lua_State *L, int index);
  3. const char * lua_tostring (lua_State *L, int index);
  4. size_t lua_strlen (lua_State *L, int index);

即使给定的元素的类型不正确,调用上面这些函数也没有什么问题。在这种情况下,lua_toboolean、lua_tonumber 和lua_strlen 返回0,其他函数返回NULL。

lua 允许 string 中包含‘/0‘,所以下面的语句总是有效的:

[c-sharp] view plain copy

  1. const char *s = lua_tostring(L, -1); /* any Lua string */
  2. size_t l = lua_strlen(L, -1); /* its length */
  3. assert(s[l] == ‘/0‘);
  4. assert(strlen(s) <= l);

2.4:其他堆栈操作

[c-sharp] view plain copy

  1. int lua_gettop (lua_State *L);
  2. void lua_settop (lua_State *L, int index);
  3. void lua_pushvalue (lua_State *L, int index);
  4. void lua_remove (lua_State *L, int index);
  5. void lua_insert (lua_State *L, int index);
  6. 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:将栈顶元素出栈,并将其赋给一个全局变量名

[c-sharp] view plain copy

  1. void setfield (const char *index, int value) {
  2. lua_pushstring(L, index);
  3. lua_pushnumber(L, (double)value/MAX_COLOR);
  4. lua_settable(L, -3);
  5. }
  6. void setcolor (struct ColorTable *ct) {
  7. lua_newtable(L); /* creates a table */
  8. setfield("r", ct->red); /* table.r = ct->r */
  9. setfield("g", ct->green); /* table.g = ct->g */
  10. setfield("b", ct->blue); /* table.b = ct->b */
  11. lua_setglobal(ct->name); /* ‘name‘ = table */
  12. }
时间: 2024-10-31 12:42:00

c++ 与 lua 简单交互参数介绍的相关文章

Nginx+php配置文件及功能参数介绍

目录: 一.Nginx配置文件 二.upstream 模块介绍: 三.fastcgi 模块介绍: 四.PHP配置文件 一.Nginx配置文件 user  www www;                                                                                                                                     ##nginx程序运行用户和用户组 worker_process

【体系结构】Oracle参数介绍

[体系结构]Oracle参数介绍 1  BLOG文档结构图     2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Oracle中的各种参数介绍及其查询方法 ② Oracle中V$PARAMETER及V$PARAMETER2的区别 ③ 隐含参数的查询.重置.清除 ④ 会话参数和实例参数的查询 ⑤ 静态参数和动态参数.延迟参数 ⑥ V$PARAMETER视图的每列含义(重点) Tips: ①

ffmpeg 安装和参数介绍

1. mac  os系统下编译安装 官网:https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX 廖雪峰: http://www.liaoxuefeng.com/article/0013738927837699a7f3407ea5f4b5caf8e1ab47997d7c5000 http://blog.csdn.net/luka2008/article/details/21243499  (有问题,可以直接用brew安装编码器) 重点:安装 xc

SQLMAP参数介绍

转自:http://zhan.renren.com/bugpower?gid=3602888498044629629&checked=true SQLMAP参数介绍 sqlmap的使用方式:python sqlmap.py [options]: sqlmap中一共有以下十六个选项卡: 帮助选项卡: Target(目标选项卡): Request(请求选项卡): Optimization(优化选项卡): Injection(注射选项卡): Detection(探测选项卡): Techniques(注

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

Puppet 命令参数介绍(三)

Puppet 命令参数介绍 前言: Puppet的工作原理: puppet master启动默认是监听tcp协议的8140端口.通过ruby的webrick web接收agent端的请求,根据请求内容与master的统一接口文件site.pp文件匹配,将匹配到的主机资源编译成catalog向agent分发,agent接收到请求后在本地应用. Puppet 命令分为独立命令和集成命令,puppet3.0版本后就没有了独立命令,集成命令也是未来的一个趋势,所以只写puppet集成命令. 通常查看帮助

jmeter--工具参数介绍

定时器 Constant Throughput Timer (常数吞吐量定时器) 参数介绍: Target throughput(in samples per minute):目标吞吐量.注意这里是每分钟发送的请求数 Calculate Throughput based on :有5个选项,分别是: This thread only :控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的 target Throughput 乘以矣线程的数量. All active threads : 设置的

音频滤镜参数介绍

音频滤镜 当你配置编译FFmpeg时,先采用--disable-filters可以禁止所有的滤镜,然后显式配置想要支持的滤镜. 下面是当前可用的音频滤镜 adelay 延迟一个或者多个音频通道 它接受如下选项: delays 参数是以|分隔的列表字符串,分别用于指明对应各个通道延迟的微秒(milliseconds)数.应提供至少一个大于0的延迟.未使用的延迟将被静默忽略.如果延迟值数量小于通道数量,则剩余通道不会被延迟. adelay例子 第一通道延迟1.5秒,第三通道0.5秒(其它通道均不延迟

unity3d和php后台简单交互

unity3d开发时,用PHP作为后台是个不错的选择.对一些数据吞吐量不是很大的游戏,比如某个游戏的排名,登录等等,一般的php程序能够胜任了,并且php语言简单,开发容易对数据库尤其是mysql的支持良好,我们还可以通过php对接一些SDK(比如推送)作为unity3d的中转站.基于以上原因我们完全有理由使用php作为游戏后台.而对于数据吞吐量适中的游戏我们还可以,使用php编写websocket进行更实时的交互通讯(这里我们讨论websocket的情况,有空我再另写一遍来讨论).下面我们来看