LUA脚本调用C场景,使用C API访问脚本构造的表
LUA调用C
lua解析中集成了一些系统服务, 故脚本中可以访问系统资源, 例如, lua脚本可以调用文件系统接口, 可以调用数学库,
但是总存在一些lua脚本中访问不到的系统服务或者扩展功能, 如果这些系统服务或者扩展功能是使用C语言实现,
那么可以, 使用lua库的对C库的封装方法, 将其中功能封装成lua 接口, 这样脚本就调用这些lua接口调用这些功能。
-------
这种情况,是以lua脚本作为宿主程序。
C调用LUA
另外一种场景,是C程序作为宿主程序, 调用LUA脚本, 例如将lua脚本做配置文件功能,
C语言调用 Capi运行lua脚本, 并取得其中配置的值。
本例结合第一种情况, 介绍C中如何获得lua脚本的表参数。
LUA C API
lua c api 介绍 : http://www.cnblogs.com/stephen-liu74/archive/2012/07/18/2433428.html
主要使用getfield接口访问表中某个key的值:
lua_getfield[-0, +1, e]
void lua_getfield (lua_State *L, int index, const char *k);Pushes onto the stack the value
t[k], wheretis the value at the given valid index. As in Lua, this function may trigger a metamethod for the "index" event (see §2.8).
遍历表格的方法:
http://blog.csdn.net/chencong112/article/details/6908041
http://www.cnblogs.com/chuanwei-zhang/p/4077247.html
lua_getglobal(L, t);
lua_pushnil(L);
while (lua_next(L, -)) {
/* 此时栈上 - 处为 value, - 处为 key */
lua_pop(L, );
}
lua_getglobal(L, t);
len = lua_objlen(L, -);
for (i = ; i <= len; i++) {
lua_pushinteger(L, i);
lua_gettable(L, -);
/* 此时栈顶即为 t[i] 元素 */
lua_pop(L, );
}
DEMO
描述: 使用c封装了一个lua 接口, 此接口传入一个表, 在C中访问此表中某个key值。
-- temperature conversion table (celsius to farenheit)
require "test" test.printTable({["a"]="aa"})
#include <stdlib.h>
#include <math.h> #define lmathlib_c
#define LUA_LIB #include "lua.h" #include "lauxlib.h"
#include "lualib.h" static int printTable (lua_State *L) {
printf("%s\n", "hello world"); int n = lua_gettop(L); if ( n != )
{
printf("%s\n", "printTable must has one arg");
} if ( lua_istable(L, -) )
{
lua_getfield(L, -, "a");
printf("arg one table[a]=%s\n", lua_tostring (L, -));
}
else
{
printf("%s\n", "printTable arg must be table");
} return ;
} static const luaL_Reg testlib[] = {
{"printTable", printTable},
{NULL, NULL}
}; LUALIB_API int luaopen_test (lua_State *L) {
luaL_register(L, "test", testlib);
return ;
}
打印:
:~/share_windows/openSource/lua/lua-5.1.5$ lua ./test/test.lua
hello world
arg one table[a]=aa
LUA脚本调用C场景,使用C API访问脚本构造的表的更多相关文章
- 快速入门Redis调用Lua脚本及使用场景介绍
Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文 ...
- Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
在上一篇文章 Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法 中,我对LuaBehaviour脚本进行了扩展,添加了两个新的UI监听方法,也提到最好能单写一个脚本处理此 ...
- lua如何调用C++函数
第一步是定义函数.所有在Lua中被调用的C/C++函数将使用下面一类指针进行调用: typedef int (*lua_CFunction) (lua_State *L); 换句话说,函数必须要以Lu ...
- tolua++实现lua层调用c++技术分析
tolua++技术分析 cocos2dx+lua 前言 一直都使用 cocos2dx + lua 进行游戏开发,用 Lua 开发可以专注于游戏逻辑的实现,另外一方面可以实现热更新:而且 lua 是一个 ...
- 深入xLua实现原理之Lua如何调用C#
xLua是腾讯的一个开源项目,为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力.本文主要是探讨xLua下Lua调用C#的实现原理. Lua与C#数据通信机制 无论是Lua调用C# ...
- 原生实现C#和Lua相互调用-Unity3D可用
引言 本篇简单介绍如何在C#中执行Lua脚本,传递数据到Lua中使用,以及Lua中调用C#导出的方法等.在Unity中开发测试,并打IL2CPP的Android包在模拟器上运行通过.Lua版本 ...
- Lua中调用C函数
Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回 ...
- shell脚本调用C语言之字符串切分之strtok函数
今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...
- python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)
昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...
随机推荐
- BZOJ4553: [Tjoi2016&Heoi2016]序列
Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所 ...
- js小效果-轮播图
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- C语言(1)
认知C语言 计算机有很多的语言,现在要学习的C语言便是一种.下面便是一个基本的框架: #include <stdio.h> #include <stdlib.h> int ma ...
- Redis在windows下的安装使用
下载的windows版本是redis-2.0.2,解压到D盘下: D:\redis-2.0.2 启动Redis服务(conf文件指定配置文件,若不指定则默认): D:\redis-2.0.2>r ...
- Setting start page of Windows Phone dynamically through code
Essentially this one line of code will set the start page of the application. var navTo = new Uri(&q ...
- java中用过滤器解决字符编码问题
java的web程序经常出现中文乱码的问题,用一个实现了Filter接口的过滤器类可以较好地解决这个问题. 方式一 EncodingFilter import java.io.IOException; ...
- Linux下安装配置Apache+PHP+MariaDB
一.安装apache 1.下载并安装apache yum install httpd 2.启动apache systemctl start httpd.service 3.停止apache syste ...
- c#语句 习题
1.输入月份,日期,打印出是今年的第几天.(今年是平年) 2. 一个游戏,前20关是每一关自身的分数,21-30关每一关是10分,31-40关每一关是20分,41-49关每一关是30分,50关是100 ...
- HTTP协议 (四) 缓存
HTTP协议 (四) 缓存 阅读目录 缓存的概念 缓存的好处 Fiddler可以方便地查看缓存的header 如何判断缓存新鲜度 通过最后修改时间,判断缓存新鲜度 与缓存相关的header ETag ...
- Unity3D着色器Shader编程入门(一)
自学Unity3D也有大半年了,对Shader一直不敢入坑,最近看了些资料,以及通过自己的实践,对Shader还是有一点了解了,分享下仅作入门参考. 因Shader是对图像图像渲染的,学习前可以去了解 ...