luaGlue函数——lua中调用c/c++函数

lua 调用 C Lua中调用C函数(lua-5.2.3) 由sf0501创建,小路依依 最后一次修改2016-11-16 Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性。 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数。 对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef in... 阅读详情

         所有能在lua中调用的c/c++函数都必须是遵循lua定义的函数原型:typedef int (*lua_CFunction) (lua_State *L),其中返回值整型int表示,函数返回值个数。lua调用c/c++函数,他们之间的交互依然通过lua栈,而且需要认识到的是,无论是lua调用c函数,还是c/c++调用lua函数,他们之间的交互用的栈并不是全局栈,每个函数都维护着一个自己的私有栈,所有的交互数据均保存在这个私有栈中。

         当lua调用c函数时,lua把所有参数都压进函数的私有栈中,并且第一个参数在栈中的位置必定为index=1,第二个参数为index=2,以此类推,的位置。c函数需要从栈中取得参数,在完成相关处理后把处理结果压入私有栈中。返回结果在理论上可以是任意数目,在c函数的最后必须返回代表结果的个数。


测试代码:

       lua代码:testGlueLua.lua

myFile = io.open( "io.lua", "w" )
if myFile ~= nil then
	myFile:write( "pow: ")
	myFile:write( MyPow( 3, 2 ) )
end
io.close( myFile )

          c++代码:test.cpp

//测试lua开发库
//1.新建一个lua_state 并初始化环境
//2.加载相关lua程序库
//3.加载执行lua文件
//4.查询要执行的函数,参数入栈
//5.执行函数
//6.从lua栈中提取返回值

#include <iostream>

extern "C" //采用c编译方式
{

#include <lua\lua.h>
#include <lua\lualib.h>
#include <lua\lauxlib.h>

}

using namespace std;


//测试lua调用c函数
//所有能在lua中调用的c函数,必须具有lua定义的原型。
//lua与c/c++之间的交互依然通过lua栈。
//--无论是lua调用c函数,还是c/c++调用lua函数,每个函数都维护了自己的私有栈,而非全局栈。
//--当lua调用c函数时,会把参数压入私有栈中,第一个参数在栈中的位置总是index=1..第二个为index=2的位置,以此类推。
//--而被调用的c函数有着固定的原型:typedef int (*lua_CFunction) (lua_State *L);,c函数从交互的私有栈中取得参数
//--并处理后同样 把结果存到私有栈中,并返回返回值的个数。

//--luaGlue函数编写:
//--1.注意检查参数类型。
//--2.注意把结果压入交互栈
//--3.并返回结果个数。

int MyPow( lua_State* L )
{
	//检查两个参数类型
	double a = luaL_checknumber( L, 1 );
	double b = luaL_checknumber( L, 2 );

	lua_pushnumber( L, pow( a, b ) );
	return 1; //返回值个数
}

int main()
{
	//初始化lua环境,加载了5.1版本的所有程序库
	lua_State* L = lua_open();
	luaL_openlibs( L );//分开加载库是io库有个bug听说

	/*::luaopen_base( L );
	::luaopen_io( L );
	::luaopen_debug( L );
	::luaopen_math( L );
	::luaopen_os( L );
	::luaopen_package( L );
	::luaopen_string( L );
	::luaopen_table( L );*/
	
	luaL_dofile( L, "test.lua" ); //执行配置文件
	int a = 1;
	int b = 2;
	lua_getglobal( L, "add" ); //查询函数
	lua_pushnumber( L, a ); //参数压栈
	lua_pushnumber( L, b );

	if( lua_pcall( L, 2, 1, 0 ) != 0 ) //错误检测
	{
		cout <<"error running function add:" <<lua_tostring( L, -1 ) <<endl;
	}

	if( !lua_isnumber( L, -1 ) ) //检查返回值是否为数值
	{
		cout <<"add 必须返回一个数值" <<endl;
	}

	int c = lua_tonumber( L, -1 );
	lua_pop( L, 1 ); //从栈中弹出返回值!!!
	
	cout <<"a + b = " <<c <<endl;



	/*---测试lua中调用c函数---*/
	lua_pushcfunction( L, MyPow );
	lua_setglobal( L, "MyPow" ); //第二个参数为lua中使用MyPow的名称

	//lua_register( L, "MyPow", MyPow );  //第二个参数为lua中使用MyPow的名称

	//加载执行lua文件
	luaL_dofile( L, "testLuaGlue.lua" );
	
	return 0;
}

  在编译运行c++程序后,可以再程序目录底下看到生成的io.lua文件:



使用glue包在R语言中以标准格式输出最终结果 通过这些示例,你可以看到glue包提供了一种简单而强大的方式来以标准格式输出最终结果。其中一个流行的包是glue包,它提供了一种简单而灵活的方式来将变量和字符串组合在一起,并以标准格式输出结果。在本文中,我们将介绍如何使用glue包将最终结果以标准格式输出。在这个例子中,我们使用了花括号({})将变量括起来,并在字符串中使用它们。首先,确保已经安装了glue包。在这个例子中,我们在花括号中进行了表达式计算,并将计算结果插入到字符串中。接下来,我们将展示几种常见的使用情景,并演示如何使用glue包输出结果。 阅读详情

相关推荐

Simulink中Simscape—Fluids模块(原Simhydraulics)学习记录

学习来源:http://cn.mathworks.com/help/physmod/hydro/getting-started-with-simhydraulics.html 主要学习内容如下图: 详细内容: 1、组件来源 SIMULINK浏览器中的模块:Simscape_Foundation 和 Simscape_Fluids。 2、Simscape下包括多个子

1万+

lua学习:lua与C/C++程序的整合

lua与C/C++交互,主要靠lua API和向lua注册好的函数。 这里起关键作用的要数lua_State的结构,这就得讲一下Lua环境和Lua Stack。 Lua环境 Lua环境由所有可操作的数据构成,如编译好的函数、变量以及其他运行时内存。这些数据保存在一个称做lua_State的结构中。所有Lua应用程序都要求至少有一个lua_State,如果需要还可以有多个(如需

—— 6659

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

<10>Lua C/C++互相调用

先来说下大致脚本引擎框架,此次采用如下,即运行C++代码启动程序,然后加载Lua脚本执行! 1.基础 Lua脚本中只能调用 int (*lua_CFunction) (lua_State *L) 这种类型的C/C++函数; 所有的C/C++函数如果要给Lua进行调用,只能用这样的函数来封装; 那么在C/C++中怎么获得Lua传递过来的参数? 通过操作Lua...

jadeshu的博客 5245

双极性步进电机驱动技术:从H桥电路到精准控制

本文深入解析了双极性步进电机驱动技术的核心,从H桥电路的基础原理讲起,阐述了其作为实现电机正反转和精准控制的关键。文章详细介绍了H桥的工作模式、防共态导通设计,并对比了L298N、DRV8825及TMC2209等主流集成驱动芯片的选型。进一步探讨了通过微步进与电流矢量控制实现平滑、静音运行的高级技术,并提供了基于STM32的实战代码与避坑指南,帮助开发者从理论到实践全面掌握精准运动控制。

tea88的博客 592

从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击

本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。

weixin_30918633的博客 120

lua教程

-----------------------------------------------------------------------------------------------------------------------第0章 序言本章包括作者的序言、文章的体例(convention)以及其它一些“每本书开头都会的内容”。0.1 序言目前很多程序语言都专注于帮你编写成千上万行的代

skyremember的专栏 5403

如何使用Google Maps API爬取地理数据:详细教程与Python实现

Google Maps API 是一组服务的集合,允许开发者访问地图、地点、路线等地理信息。:将地址转换为地理坐标,或将地理坐标转换为地址。:计算两点之间的行车路线、步行路线等。Places API:获取附近的地点、商店、餐馆等。:计算多个地点之间的距离和时间。在接下来的代码中,我们将结合这些 API,展示如何获取并处理地理数据。本文详细介绍了如何使用 Google Maps API 获取地理数据,涵盖了从地址转经纬度、获取地点详情、计算路线、计算多个地点的距离与时间等多个功能。

2201_76125261的博客 733

在游戏引擎中集成Lua

lua中使用协程助力游戏

qq_41940565的博客 2027

TriCore架构-如何将系统刷成HSM

本文介绍了芯片刷写操作流程:首先加载project_Merge.s19文件,进入UCB界面展开BMHD0_ORIG和BMHD1_ORIG。重点说明需要将STAD地址从原始值A0000000修改为0XA00A0000,并详细描述了编辑、更新和写入芯片的步骤。最后提示在HSM刷写过程中如遇错误可能需要输入密码。该操作涉及关键地址修改,需谨慎执行。

xiandang8023的博客 95

九天揽月带你玩转Ardupilot 的EKF2纸老虎(1)

目录 目录 摘要 1.kalman基础知识储备 摘要 本文主要记录自己学习ardupilot的ekf2代码的过程,相信很多人想移植或者学习ekf2,看到眼花缭乱的代码无从下手。九天揽月将带你玩转Ardupilot 的EKF2纸老虎 1.kalman基础知识储备 (1)先来看下最基础也是最重要的线性kalman 总结:不要害怕kalman,只要你可以懂得线性kal...

陌城烟雨 1万+

lua & c & c++

LuaGluelua可以让程序员开发在lua脚本中调用c/c++函数的接口。 我们把这些接口称做luaGLue函数。lua_State* pLuaState = lua_open() luaopen_base(pLuaState) lua_iolibopen(pLuaState) lua_strlibopen(pLuaState) lua_mathlibopen(pLuaState) l

kavenGw的专栏 377

安路TangDynasty和FD和JTAG驱动器安装

安路FPGA产品矩阵包含SALPHOENIX高性能、SALEAGLE高性价比和SALELF低功耗三大系列,广泛应用于网络通信、消费电子等领域。配套的TangDynasty(TD)集成开发环境支持标准设计输入,提供完整优化流程与调试工具。简要介绍了TD 6.2.1版本的安装步骤。

wangjie36的博客 1027

基于事件驱动的lua--c/c++交互

PS:参考自《lua游戏开发指南》        事件驱动的程序可以增强系统的可扩展性——lua游戏开发指南原话        书中的事件驱动程序主要分为几个重要的部分,是lua与c/++的双向交互。                1、提供一个luaGlue函数在lua中注册事件处理函数。                 2、c/c++代码获取事件处理函数名称,在c/c++中调用lua编写

所学、所思、所悟——coderling 3713

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Lua C/C++互相调用

先来说下大致脚本引擎框架,此次采用如下,即运行C++代码启动程序,然后加载Lua脚本执行! 1.基础 Lua脚本中只能调用 int (*lua_CFunction) (lua_State *L) 这种类型的C/C++函数; 所有的C/C++函数如果要给Lua进行调用,只能用这样的函数来封装; 那么在C/C++中怎么获得Lua传递过来的参数? 通过操作Lua...

weixin_30662109的博客 145

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

三国杀(2):QT5.12 C/C++ lua tolua++ 编译 集成,及使用介绍

最近对lua比较感兴趣,工欲善其事必先利其器,方便下一步的学习。 一. 下面两张图比较形象描述了lua语言定位及交互方法: (1) Lua可以让程序员开发在Lua脚本中调用C/C++函数的接口,这个接口称做LuaGlue函数,因为它们可以在Lua环境中整合C /C++的功能。 (2) Lua API提供了函数让C++代码也可以直接调用Lua函数,还提供了方...

m0_37651448的博客 800

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

lua学习历程(2)

Lua环境由所有可操作的数据构成,入编译好的函数,变量以及其他运行时内存,这些数据保存在一个称为lua_State的结构中。Lua环境是用来发送和接受数据的地方,它利用栈Lua Stack来达成目的,lua Stack只能通过Lua的API来访问。 C++代码和Lua的交互是双向的。 我们可以从Lua脚本中调用c++函数的接口,而这些接口被称为LuaGlue函数,因为它们可以在Lua环境中整合C+...

qq842447820的博客 301

《Lua游戏开发实践指南》学习笔记4

Lua与C/C++程序的整合初期设计要点,应尽可能的确定每一个可以使用Lua的地方Lua环境由所有可操作的数据构成,如编译好的函数、变量以及其它运行时内存,这些数据保存在一个叫lua_State的机构中。Lua应用程序中至少有一个lua_State,如果需要可以有多个。Lua环境是用来发送和接收数据的地方,它利用栈(Lua Stack)来达到该目的。Lua栈不同于系统栈,它只...

weixin_33748818的博客 170

lua3学习笔记3

(((深入学习lua 3 ))) 一.lua 与 c/c++程序的整合;lua处于底层代码和用户之间的位置, 所以在设计时会更加注重与c/c++的通信集成。 lua环境:lua应用程序都要求至少有一个lua_State来保存环境所需的数据结构:所需的函数、变量、内存空间。 lua栈只能通过LuaAPI来获取的。 LuaGlue函数:LuaGlue函数就是Lua调用c++函

915

《游戏AI开发指南(基于Lua的人工智能在游戏中的应用)》(Yanlz+Unity+SteamVR+5G+AI+VR云游戏+Lua+人机交互+沙箱+导航+决策树+影响力地图+立钻哥哥+==)

《游戏AI开发指南(基于Lua的人工智能在游戏中的应用)》 《游戏AI开发指南(基于Lua的人工智能在游戏中的应用)》 版本 作者 参与者 完成日期 备注 YanlzAI_LuaForGames_V01_1.0 严立钻 ...

VRunSoftYanlz的博客 6875

Lua游戏开发实践指南

《Lua游戏开发实践指南》基本信息原书名:Game Development with Lua作者: (美)Paul Schuytema Mark Manyen 译者: 田剑丛书名: 华章程序员书库出版社:机械工业出版社ISBN:9787111403357上架时间:2012-11-21出版日期:2013 年1月开本:16开页码:1版次:1-1所属分类: 计算机 更多关于 》》》《Lua游戏开发实践...

china-pub网上书店 233

LUA调用C函数

文章目录前言Lua调用C的两种方式1. C函数进行调用2. C库进行调用 参考来源: 《Programming in Lua》中的第26章.调用C函数 《lua 5.3中文参考手册》 前言 lua通过一些方式实现对C函数的调用是lua高扩展性的体现。 Lua调用C的两种方式 lua调用C的两种方式其实是在不同的环境下去对C进行调用。 在C中通过lua的基础库函数调用C(通过C函数进行调用) 在lua中调用C(对自己编译的C动态库进行调用) 无论是上面哪种方式去调用C函数,都必须遵

Dr_chaser的博客 2947

【算法】06 GLUE算法C++实现

用C++编写GLUE程序,并以线性回归模型参数估计为例测试GLUE程序。

记录专业模型开发、算法程序设计、软件学习笔记、生活日志。 3499

Lua 如何在Lua中调用C/C++函数

Lua调用C函数有两种方式 1. 程序主体在C中运行,C函数注册到Lua中。C调用Lua,Lua调用C注册的函数,C或者Lua得到函数的执行结果。 2. 程序主体在Lua中运行,C函数作为库函数供Lua使用。

HelloKandy's Blog 1327

lua调用c函数

环境配置 使用lua调用c语言编写的函数,首先要安装c语言的lua库,然后将其编译为动态链接库。 在Linux上直接使用apt-get安装的lua是没有自动安装lua库的,需要下载lua的源码编译安装。 编写c函数 如同main函数是所有c程序的入口程序一样,lua可调用的c语言程序也有一个入口程序叫做luaopen_lib,其中lib是你自己的库的名字。除此之外,每个函数要传入的第一个参数必须是lua_State类型,也就是lua的stack。 lua和c之间的参数交换,是通过栈来完成的,也就是函数的第一

watqw的博客 1723

LuaJIT虚拟机-函数与原型

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34124651的博客 668
上一篇: c/c++调用lua函数
下一篇: 基于事件驱动的lua--c/c++交互
CoderLing
博客等级 码龄15年 40粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值