从Lua调用C

从Lua调用C:

方式:C函数从栈中获取函数參数(第一个參数总是局部栈的索引1),将结果压入栈中,C函数须要返回结果数量。

每一个函数都有自己的局部私有栈

样例:
static int l_sin(lua_State *L){
	double d = lua_tonumber(L,1);	//获取參数,索引为1(私有栈)
	lua_pushnumber(L,sin(d));		//压入结果
	return 1;						//返回结果的数量
}

注冊函数到Lua:

1、函数的原型: typedef int(*lua_CFunction)(lua_State *L)

在函数返回之前,Lua会自己主动删除栈中结果之下的内容

2、使用lua_pushcfunction(L,func)

lua_setglobal(L,"mysin")

3、參数类型检查:将lua_tonumber(L,1)改成luaL_checknumber(L,1)

注冊函数模块:

luaL_register:这个函数接收一些C函数及其名称,并将这些函数注冊到一个与模块同名的table中。

样例:
C:
static const struct luaL_Reg mylib[] = {
	{"dir",l_dir},
	{NULL,NULL}	//结尾
}
luaL_register(L,"mylib",mylib);

Lua:
require "mylib"
print("mylib.mysin(10)",mylib.mysin(10))

数组操作:

void lua_rawgeti(lua_State* L,int index,int key)

void lua_rawset(L,index,key)

lua_rawgeti(L,t,key)等价于:

lua_pushnumber(L,key)

lua_rawget(L,t)

lua_rawget类似于lua_gettable,差别在于raw能够绕过元表的index

lua_rawseti(L,t,key)等价于:

lua_pushnumber(L,key)

lua_insert(L,-2) //将‘key‘放到前一个值的以下:由于rawset的规则是key在以下value在栈顶

lua_rawset(L,t)

这两个函数都是raw操作,比涉及元表的table訪问更快。

演示样例:

int l_map(lua_State *L){
	int i,n;

	luaL_checktype(L,1,LUA_TTABLE);	//第一个參数必须是一个table
	luaL_checktype(L,2,LUA_TFUNCTION);	//第二个參数必须是一个函数

	n = lua_objlen(L,1);		//获取table大小
	for(int i=1;i<=n;i++){
		lua_pushvalue(L,2);		//压入f
		lua_rawgeti(L,1,i);		//压入t[i]
		lua_call(L,1,1);		//调用f(t[i])
		lua_rawseti(L,1,i);		//t[i] = 结果,***rawseti设置后会清除栈顶的返回值
	}

	return 0;
}
时间: 2024-12-22 04:30:28

从Lua调用C的相关文章

Lua 调用 Opencv 的方法

Lua 调用 Opencv 的方法 最近想用 Lua 调用 Opencv 进行相关像素级操作,如:bitwise_and 或者 bitwise_or,从而完成图像 IoU 的计算. 那么,怎么用 Lua 调用 Opencv 呢? 查了 Torch 的官方文档,发现只有这么几个可以调用的包: 链接: https://github.com/torch/torch7/wiki/Cheatsheet 然后,你点击一个进去,发现有这么一个方法,可以安装对应的 Opencv 包:  然后,你就在终端里输入:

Lua调用自定义C++类

弄了一天终于会Lua调用自定义C++类.不容易啊. 我的电脑是64位的,装了64的Python不行,装了32位的就可以了,靠!下面是报错信息 python pyyaml Cheetah全都是装32位的,其中python版本是用2.7.8,是可以的. Cocos2d-x v3.2 Cocos Code IDE 1.2.0 NDK r9d dos2unix,windows下可能在执行脚本时有这个错误.是创建项目时没有了这个文件,可以去cocos2dx里面复制一个,如 E:\cocos2d-x-3.2

Lua调用C函数

在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中.为了区分返回结果和栈中的其他值,每一个函数返回结果的个数. 这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈.哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈.第一个参

Lua与C++交互初探之Lua调用C++

Lua与C++交互初探之Lua调用C++ 上一篇我们已经成功将Lua的运行环境搭建了起来,也成功在C++里调用了Lua函数.今天我来讲解一下如何在Lua里调用C++函数. Lua作为一个轻量级脚本语言,他只包含了一些必要的系统库函数,当有需要时还得自己去写.有一次我要做一个两数异或的操作发现函数库里居然没有异或运算.不得不非常苦逼的自己去写.后来接触Lua深了之后才知道将这种"缺陷"可以由C函数来弥补.但要做到这一点对于一个对C只知道if else的学生来说确实还是有不少难度. 在学习

Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用

记得很久以前,刚开始接触Quick,那时候尝试过一次这样的操作,不过失败了. 因为那时候还年幼,对这里面的一套机制不是太熟悉.现在回头再做这样的事,遇到了问题,但是都很好的根据自己的理解给解决了. 现在记录下,我tolua成功的过程,在写blog的过程中,更熟练其中的原理. PS:网上关于quick tolua的blog都有点过时了(dualface的quick官网文章),具体的过程,还是要自己多注意. 我是基于Quick  2.2.1-rc版本实现的. ————————————————————

lua调用C语言

在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中.为了区分返回结果和栈中的其他值,每一个函数返回结果的个数. 这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈.哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈.第一个参

Lua学习笔记--Lua调用C初探

上次学习了怎么用C调用Lua的函数,并返回一个结果,这次看看怎么反过来,用Lua调用C的函数. 一.简介 C调用Lua函数比较简单,只需要操作相关的栈就可以了,但是Lua调用C的话,稍微有一点麻烦,虽然还是用栈来进行数据的传递,但是由于Lua中本身没有C中写的函数,所以需要多一步将C函数注册到Lua中的步骤. Lua反过来调用C函数的话,首先,我们要写一个要被调用的函数,这个函数有一个格式的要求 ,返回值为int,但是这个int并不代表Lua函数的返回值,而是函数返回值的个数,Lua支持多重返回

Lua 与C/C++ 交互系列: Lua调用C/C++函数(4-2)

1.本文继续讲解Lua调用C/C++函数,本文的重点是通过metatable来实现Lua Code面向对象调用注册的C函数.本文中涉及的Environment 伪索引,userdata 以及GC 垃圾回收器的内容,都是简单的讲解.不作为本文的重点,这些内容都将在以后的章节中继续讲解. 2.本文涉及的到主要知识点补充说明. 2.1 void *lua_newuserdata (lua_State *L, size_t size); 函数说明 This function allocates a ne

lua调用c++函数返回值作用

2015/05/28 lua调用c++接口,返回给lua函数的是压入栈的内容,可以有多个返回值.但是c++接口本身也是有返回值的,这个返回值也非常的重要,会决定最后返回到lua函数的值的个数. (1)c++自定义类 int Test::getMsg(lua_State* L){ lua_pushnumber(L, 100); lua_pushnumber(L, 200); return 2; } (2)tolua++导出的lua调用的c++接口(部分有修改) int lua_cocos2dx_c

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

原文地址:http://segmentfault.com/a/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质2.在cocos2d-x项目里,把纯C函数注册进Lua环境,理解cocos