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中数据的步骤: ...
随机推荐
- 20145308刘昊阳 《Java程序设计》实验一 Java开发环境的熟悉 实验报告
20145308刘昊阳 <Java程序设计>实验一报告 实验名称 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试J ...
- SQL中union运算操作的理解
在SQL中,对于并运算,可以使用union关键字. 例如: SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FRO ...
- 五、点数器《苹果iOS实例编程入门教程》
该app为应用的功能为一个简单的数数程序 现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View Applic ...
- Node.js 手册查询-1-核心模块方法
Node.js 学习手册 标签(空格分隔): node.js 模块 核心模块 核心模块是被编译成二进制代码,引用的时候只需require表示符即可 os 系统基本信息 os模块可提供操作系统的一些基本 ...
- The Bus Driver Problem
题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=90648#problem/G 题意: 给每位司机分配一个白天和晚上的行车路线, ...
- 李洪强漫谈iOS开发[C语言]-045-循环结构
- Oracle函数解析
一:大小写控制函数 lower()函数:(此函数将全部的大写字母都可以变为小写字母) upper()函数:(将输入的字符串变为大写字母) initcap()函数:(将每个字符串的首字母大写) 二:字 ...
- [LintCode] Number of Islands 岛屿的数量
Given a boolean 2D matrix, find the number of islands. Notice 0 is represented as the sea, 1 is repr ...
- 跨集群 distcp命令
两个集群之间做数据同步,而且两个集群之间的版本不一致,这个时候使用的是hftp协议或者webhdfs协议! 如果试图在两个运行着不同HDFS版本的集群上使用distcp命令来复制数据并使用hdfs协议 ...
- Jquery省市区三级联动案例
//Java部分代码 public String province() throws Exception { List<Province> list=cityBiz.showProvinc ...