Lua和C++交互 学习记录之六:全局函数交互

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍)

部分内容查阅自:《Lua 5.3  参考手册》中文版 译者 云风 制作 Kavcc

vs2013+lua-5.3.3

1.C++调用Lua中函数

①Lua中的函数

1 function add(x,y)
2     return x + y
3 end

②C++调用函数

 1     //lua->stack,全局函数位置-1
 2     lua_getglobal(L, "add");
 3
 4     //c->stack,传入函数参数
 5     lua_pushinteger(L, 10);
 6     lua_pushinteger(L, 20);
 7
 8     //lua->stack,调用函数,2表示传入2个参数,1表示一个返回值,并将返回值放到-1的位置
 9     lua_call(L, 2, 1);
10
11     //stack->c
12     printf("add function return value : %d\n", lua_tointeger(L, -1));

2.Lua调用C++中的函数

①Lua能调用的C++函数必须符合如下函数签名:

typedef int (*lua_CFunction) (lua_State *L);

在函数里面将相应的数据进行栈操作;

返回值表示入栈供Lua使用的返回值个数。

②C++中函数

 1 int average(lua_State* L){
 2     //lua->stack,得到Lua调用函数输入的个数
 3     int lua_args_count = lua_gettop(L);
 4
 5     //lua->c,得到所有Lua中输入参数的值
 6     lua_Number sum = 0;
 7     for (int i = 1; i <= lua_args_count; ++i){
 8         sum += lua_tonumber(L, i);
 9     }
10
11     //c->stack,将平均值和总值返回到Lua中的返回值
12     lua_pushnumber(L, sum / lua_args_count);
13     lua_pushnumber(L, sum);
14
15     //返回个数给Lua
16     return 2;
17 }

③注册C++的函数到Lua中

1 lua_register(L, "average", average);
2
3 ////lua_register宏替代了下面两个函数
4 //lua_pushcfunction(L, average);
5 //lua_setglobal(L, "average");

④Lua中进行调用C++中的函数

1 local ave,sum = average(10,20,30)
2 print("ave : ",ave," sum : ",sum)
时间: 2024-07-31 14:32:09

Lua和C++交互 学习记录之六:全局函数交互的相关文章

JavaScript学习记录day7-高阶函数

JavaScript学习记录day7-高阶函数 [TOC] 1. 什么是高阶函数 高阶函数英文叫Higher-order function.那么什么是高阶函数? JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. 一个最简单的高阶函数: function add(x, y, f) { return f(x) + f(y); } 当我们调用add(-5, 6, Math.abs)时,参数x,

C++学习27 用全局函数重载运算符

运算符重载函数既可以声明为类的成员函数,也可以声明为所有类之外的全局函数. 运算符重载函数作为类的成员函数 将运算符重载函数声明为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数.之所以少一个参数,是因为这个参数是隐含的. 例如,上节的 complex 类中重载了加法运算符: complex operator+(const complex & A)const; 当执行: c3 = c1 + c2; 会被转换为: c3 = c1.operator+(c2); 通过 this 指针隐式

Lua和C++交互 学习记录之四:全局表交互

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.C++读取Lua中的表 ①在hello.lua中设置一个全局表: global_c_read_table = {integer_val = 1,double_val = 2.34,string_val = "test_string"} ②在C++中读取 1 //lua->stack

Lua和C++交互 学习记录之五:全局数组交互

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.数组 ①数组是key值从1开始并连续递增的table. ②索引号是从1开始,不是从0开始. 2.既然是table,那当然是可以用上一节的内容进行读写的. lua还提供了一些只针对数组进行操作的API,如下: ①LUALIB_API lua_Integer (luaL_len) (lua_State *L,

lua和c++交互 学习记录之一:C++嵌入脚本

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.首先需要编译出lua库 ①创建一个静态库工程,将lua-5.3.3里的所有文件包含到工程里面去 ②进行编译就可以得到一个lua的静态库,提供给后面的测试项目使用 2.创建学习测试console项目 ①引入上面步骤生成的lua静态库 ②包含lua的所有头文件 ③创建一个hello.lua,里面的内容只有一句

Java 静态内部类与非静态内部类 学习记录.

目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合,我并不是很清楚,留下一些值得思考的问题作为记录,说不定以后能自己来填.于是就会有这篇文章啦. 常规使用方法我也不想介绍,网上一大把,我就说说比较容易错的,值得注意的地方. 注意 这篇文章只是分享一下我对内部类的一些研究与困惑吧,说不定对大家有帮助,说不定能引导大家一起思考学习.Java语法知识其实

AngularJS交互学习教程推荐

0.目录 目录 预览 详述 1 Learn Angular 2 AngularJS入门教程 感悟 声明 1.预览 急着赶时间,没有时间听我废话的同学,直接看今天推荐的两个AngularJS交互学习教程. CodeCademy的LearnAngularJS Fenby的AngularJS入门教程 2.详述 许多研究表明,探究式学习.游戏式学习是较为高效的学习方式,编程语言学习更是如此.正如看电影和玩游戏的区别,你在看电影的时候,你完全处于被动的.接受内容状态,而玩游戏则全然不同,你会和计算机有交互

java学习记录(2):JMenuBar

1.在用这个时候发现很多的组件都有J的前缀,例如Button和JButton,前者是awt包的,后者是swing包的,两者耳朵区别是: AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口.AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers. 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库.由于不同操作系统的图形库所提供的功能

NFC学习记录一

随着电子钱包等的类似需求的提出,最近几年NFC(near field communication 近场通信)正在开始慢慢普及.由于工作的需要,现在正在学习NFC相关的知识,先将NFC的一些基础罗列一下,做个记录. 1.NFC简介 NFC(近场通讯)能在短距离内与兼容的设备进行识别和数据交换,一般频率在13.56MHZ,它是RFID与互联互通技术整合而来,如果RFID是父的话,NFC则是子,其继承了父请的功能,又在其上有自己的发挥. NFC一般在这三大领域应用:获取简单信息.点到点通信.电子票务.