文档章节

深入lua栈交互—cpp调用lua数据

梦想游戏人
 梦想游戏人
发布于 2015/10/16 21:49
字数 470
阅读 222
收藏 1

用原生API来交互

lua是通过lua_state这个栈来和c 交互的

1.....lua栈 index 下往上增长 如: 1 2 3 4 5 6
2.....lua栈 index 是循环的 如下 index 上到下 是 3 2 1 0 -1 -2 -3 ,栈对应的值为
    1
    2
    3
    x
    1
    2
    3
    
3......lua函数多个返回值如果上面是function返回了3个返回值,那么return a ,b,c  中 a=3 b=2 c=1 第一个返回值先入栈

栈pop问题:lua_pop(x) ;x 为 pop的个数 ,一般调用函数后 pop(1) 因为一般返回值只有一个

ps:调用函数的时候 不会堆栈平衡,返回时已经平衡了,值需要对返回的值  占用的栈清理

 

 

 

c++使用lua的数据 例子

extern "C"{
#include "src/lualib.h"
#include "src/lauxlib.h"
#include "src/lua.h"

}

#include "iostream"
using namespace std;

lua_State*l;


int get_sum(int x, int y)
{
	int sum=0;

	lua_getglobal(l, "get_sum");/*调用函数*/

	lua_pushnumber(l, x);
	lua_pushnumber(l, y);
 
	lua_call(l, 2, 3);/*参数2个,返回值3个*/

	cout << "top is  " << lua_gettop(l) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 0) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 1) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 2) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 2) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 3) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 4) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 5) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 6) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 7) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 8) << endl;
	cout << lua_tonumber(l, lua_gettop(l) - 9) << endl;


	lua_pop(l, 3);/*function返回了3个值*/


	cout << "\n\n" << endl;

	lua_getglobal(l, "b");/*获取变量 压入栈中*/
	cout <<"b=" <<lua_tonumber(l, lua_gettop(l)/*1*/ ) << endl;

	lua_getglobal(l, "a");/*获取变量 压入栈中*/
	cout << "a=" << lua_tonumber(l, lua_gettop(l)/*1*/) << endl;

	lua_getglobal(l, "c");/*获取变量 压入栈中*/
	cout << "c=" << lua_tonumber(l, lua_gettop(l)/*1*/) << endl;

	lua_pop(l, 3);/*清除栈*/
	cout << "top is" << lua_gettop(l) << endl;


	return sum;
}





int main()
{
	l = lua_open();

	luaL_openlibs(l);


	luaL_dofile(l, "a.lua");

	//cout << get_sum(1, 2) << endl;

	get_sum(1, 2);

	lua_close(l);

	system("pause");
	return 0;
}

 

 

a=10;

b=11;

c=12;

 

function get_sum(arg_1,arg_2)

return arg_1+arg_2,"100","200";

end

 

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 36
博文 433
码字总数 123540
作品 0
成都
私信 提问
用LuaBridge为Lua绑定C/C++对象

最近为了总结Lua绑定C/C++对象的各种方法、第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的Reference Manual基本上翻译了一遍,学习过程中测试代码,...

shezjl
2015/10/26
0
0
FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一。Lua的轻量、小巧、概念之简单,都使他变得越来越受欢迎。本人也使用过python做嵌入式脚本,二者各有特...

知然
2013/01/27
0
0
C/C++和Lua是如何进行通信的?

为了实现Lua和其他语言之间的通信,Lua虚拟机为C/C++提供了两个特性: 一,LuaState状态机 luaState主要是管理一个lua虚拟机的执行环境, 一个lua虚拟机可以有多个执行环境。Lua虚拟机通过维护...

borey
2014/09/17
0
10
unreal4 引擎的 Lua 开发插件 - sluaunreal

sluaunreal 是腾讯开源的适用于 unreal4 引擎的 Lua 开发插件,可让开发者高效地使用 Lua 进行业务开发。sluaunreal 作为 unreal 引擎的插件,通过 unreal 自带蓝图接口的反射能力,结合 li...

匿名
08/04
0
0
luabind 0.9.1版本尝试

luabind 0.9.1版本尝试 http://www.rasterbar.com/products/luabind 1. 编译luabind 0.9.1 linux版本 编译luabind需要bjam binary。 直接copy boost/1.37.0目录中编译好的bjam binary到~/bin......

zero-li
2014/01/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MariaDB 服务器在 MySQL Workbench 备份数据的时候出错如何解决

服务器是运行在 MariaDB 10.2 上面的,在使用 MySQL Workbench 出现错误: mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"'......

honeymose
今天
3
0
apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
6
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
12
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
4
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部