[置顶] lua 进阶3--lua文件中调用C++函数
前面讲了一下,C++读取lua文件中的变量,包括一维表、二维表这些,这节讲一下如何在lua文件中去调用C++函数
C++代码如下
#include <stdio.h>
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/*Lua 解释器指针
*/
lua_State* L;
static int average(lua_State *L)
{
/*得到参数个数*/
int n=lua_gettop(L);
double sum=0;
int i;
for(i=1;i<=n;i++)
{
if(!lua_isnumber(L,i))
{
lua_pushstring(L,"Incorrect argument to 'average'");
printf("%s\n",lua_tostring(L,i);
printf("%s\n","is not a number");
}
else
{
sum+=lua_tonumber(L,i);
}
}
/*压入平均值*/
lua_pushnumber(L,sum/n);
/*压入和*/
lua_pushnumber(L,sum);
/*返回返回值的个数*/
return 2;
} int main ( int argc, char *argv[] ){ /*初始化Lua
*/
L=lua_open();
/*载入lua基本库*/
luaL_openlibs(L);
lua_register(L,"average",average); /*运行脚本
*/
luaL_dofile(L,"test.lua"); /*清除Lua
*/
lua_close(L);
/*暂停*/
printf("Press enter to exit ..");
getchar();
return 0; }
lua 文件(test.lua)的代码如下
--call a C++ function
avg,sum = average(10,20,30,40,50,"ssss")
print("The average is ",avg)
print("The sum is",sum)
注意 最主要的是
要写一个能让Lua调用的C函数,就要符合lua_CFunction定义:typedef int (*lua_CFunction) (lua_State *L);
当Lua调用C函数的时候,同样使用栈来交互。C函数从栈中获取她的参数,调用结束后将结果放到栈中,并返回放到栈中的结果个数。
这儿有一个重要的概念:用来交互的栈不是全局栈,每一个函数都有他自己的私有栈。当Lua调用C函数的时候,第一个参数总是在这个私有栈的index=1的位置
上面定义的C函数是 static int average(lua_State *L) static 可要可不要 static 函数只表示在当前文件中可用,在其他文件中不可用
/*压入平均值*/
lua_pushnumber(L,sum/n); (表示将结果压入栈中 t[1])
/*压入和*/
lua_pushnumber(L,sum); (表示将结果压入栈中 t[2])
/*返回返回值的个数*/
return 2;
如果返回值有多个 比如3个 那么一定要return 3 否则的话(比如还是return 2 ,那么有一个返回值获取不到 而且返回值顺序也不对应) 不成功
lua_register(L,"average",average); // 第二个参数表示提供给lua文件的接口 第三个参数 C++中的函数名
初学lua 还不是特别熟,现在还是应用阶段,只能慢慢去深入
[置顶] lua 进阶3--lua文件中调用C++函数的更多相关文章
- 微信小程序wxml文件中调用自定义函数
想在微信小程序的wxml文件里自如的像vue那样调用自定义的方法,发现并不成功,得利用WXS脚本语言. WXS脚本语言是 WeiXin Script 脚本语言的简称,是JavaScript.JSON. ...
- lua中调用C++函数
lua中调用C++函数 我们产品中提供了很多lua-C API给用户在lua中调用,之前一直没用深究其实现原理,只是根据已有的代码在编码.显然这不是一个好的习惯,没用达到知其所以然的目的. 一.基本原 ...
- [Xcode 实际操作]九、实用进阶-(6)在Swift文件中调用Object-C的类和方法
目录:[Swift]Xcode实际操作 本文将演示在Swift文件中调用Object-C的类和方法. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New File]创建一个Object- ...
- JavaScript文件中调用AngularJS内部方法或改变$scope变量
需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controll ...
- CUDA常见问题之无法在c文件中调用cu文件中定义的函数
当在C源文件中调用cu文件中定义的函数时,会出现undefined reference的问题,而在C++源文件中调用cu文件中定义的函数时则不会出现这个问题. 出现上述问题的原因是,nvcc编译器采用 ...
- C++进阶--构造函数和析构函数中的虚函数
//############################################################################ /* 任何时候都不要在构造函数或析构函数中 ...
- 如何在C语言中调用Swift函数
在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中 ...
- Smarty模板中调用PHP函数
因为应用需要,要在Smarty中调用PHP函数,实现办法如下:模板 数据条数:{$data|count} 活动页面文件后缀:{$page|substr:'-3'} 特殊情况:{$page|str_re ...
- 【VS开发】MFC中调用C函数模块的解决方案
[VS开发]MFC中调用C函数模块的解决方案 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:最近调试基于MFC的程序 ...
随机推荐
- cocoapods没有自动补齐
在install cocoapods成功之后,输入头文件名的时候,没有提示,这样,我还以为是我的cocoapods安装出错了.原来是配置没有配置好. 解决办法: 选择工程的 Target -> ...
- 通过ping确定网卡mtu
使用 ping 测试确定网卡最佳 MTU 的方法 MTU ( Maximum Transmission Unit ,最大传输单元)是指某一层协议上一次能最大传输的数据量.当一个数据包超过 MTU 数据 ...
- Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete .
String url = "http://www.baidu.com"; //将要访问的url字符串放入HttpPost中 HttpPost httpPost= new HttpP ...
- 一台电脑多个文件夹安装多个Redis服务
思路: 在弄Mongodb的时候,可以在不同的文件夹下面运行不同的mongodb实例 那么Redis可以吗 现在添加一个Redis文件夹,里面放置redis,修改配置端口为6378 将以前的那个Red ...
- RTOS
1. http://www.nuttx.org/ 2. http://www.rt-thread.org/page/73.html
- 注意SQLServer2012中带参数的XP_ReadErrorLog
--15:26 2014-6-10数据库错误日志通知其中有一部分是检测ERRORLOG中若有用户登录失败信息时,会记录到Errorlog表,并邮件提醒.当时直接从同事那拿过来的脚本(08),按理说版本 ...
- 维护计划生成的SSIS包存储在哪
首先理解导入导出包的基本概念:http://technet.microsoft.com/zh-cn/library/ms141772(v=SQL.110).aspx包既可以保存在SQL Server ...
- [GeoServer]重拾GeoServer之安装篇
GeoServer的项目是一个完整的Java(J2EE)系统,现实了OpenGIS联盟的网络功能服务器规范和网络覆盖服务器规范,并且集成了Web地图服务器. 在大三的时候WebGIS课程中老师讲解过一 ...
- swift 异步加载图片(第三方框架ImageLoader)
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...
- 仿Smarty替换模板标签时遇到的问题
最近正在做一个微型的仿TP框架,当然以鄙人之技术只能略仿表层,于是遇到的问题层出不穷.今天做到View层替换模板部分,本以为一下子搞掂的事,果不其然又是败下阵来. 好了,来重点. 模板文件 test1 ...