Lua学习笔记二--在Lua中使用自己的C函数收藏

C 函数中调用Lua函数时,对于lua_pcall使用的困惑 最近在学习使用Lua,也通过基本的语法知识完成了公司的一个关于配置文件参数合法性检查的小任务。虽然任务完成了,但对于一些函数的调用目的还是搞不明白,这两天再次重看了Manual Reference,稍微梳理出了一点眉目,记录在此。 首先看一段小小小程序 //test.lua 阅读详情
   Lua学习笔记二--在Lua中使用自己的C函数收藏

新一篇: Lua学习笔记三--表的应用 | 旧一篇: Lua学习笔记一

 我不知道优快云把笔记二弄哪去了,这是第2次写的东西。

Lua学习笔记二
在Lua中使用自己的C函数

 


 

OK,上次我们掌握了如何在Lua脚本中编写一个函数,并在C文件中接应它。
现在让我们来学习另外一种交互方式。

本节的目的:在Lua脚本中调用自己写的函数。侧重点为自己编写可以被Lua脚本使用的C函数的规则。

 


 啥都不说了, RTFS

 

-------以下是Lua脚本--------
--test.lua
LuaC_MessageBox( "Last is ShowMessage! This is real MessageBox!");
---------通过LuaEdit语法测试才出鬼了--------------

//------------以下是test.cpp文件----------------
//================================================================================================================
//           Lua Test Object
//           C++ Source lua_test.cpp
//================================================================================================================
//================================================================================================================
//           Include Files
//================================================================================================================
extern "C"
{
 #include "D://My Documents//Visual Studio 2005//Projects//lua//lua//lua.h"
 #include "D://My Documents//Visual Studio 2005//Projects//lua//lua//lualib.h"
 #include "D://My Documents//Visual Studio 2005//Projects//lua//lua//lauxlib.h"
}

#include <windows.h>
#include <stdio.h>
#include <string>
using namespace std;
//================================================================================================================
//           Libraries
//================================================================================================================
#pragma comment( lib ,"D://My Documents//Visual Studio 2005//Projects//lua//release//lua.lib")
//================================================================================================================
//           Global Variables
//================================================================================================================
lua_State *L;
//================================================================================================================
//           Lua Functions
//================================================================================================================
double f( double x, double y )
{
 double ret;
 lua_getglobal( L, "f");
 lua_pushnumber( L,x);
 lua_pushnumber( L,y);
 lua_call( L, 2, 1);
 //lua_pcall( L, 2, 1, 0);

 ret = lua_tonumber( L, -1);
 //lua_pop( L, 1);
 return ret;
}
//================================================================================================================
//           C/C++ Functions
//================================================================================================================
int LuaC_MessageBox( lua_State *L)
{
 char Message[256] = "";
 int i;

 // 获取参数个数
 int n = lua_gettop(L);

 // 保存全部参数
 for ( i = 1, j = 0; i <= n ; i++)
 {
  if( lua_isstring( L, i))
   strcpy( Message, lua_tostring( L, i));
 }

 // 执行逻辑
 MessageBox( NULL, Message, "Lua Test", MB_OK );

 // 返回值压栈

 // 返回压栈参数的个数
 return 0;
}
//================================================================================================================
//           Main Functions
//================================================================================================================
int main( void)
{
 int error;

 L = lua_open();
 luaopen_base(L);
 luaL_openlibs(L);

  // 注册C/C++函数
  lua_register( L, "LuaC_MessageBox", LuaC_MessageBox);



// load the script 
// 加入了错误处理
 if ( (error = luaL_dofile(L, "test.lua")) != 0)
 {
  MessageBox( NULL, "出错啦:执行脚本出错!", "Lua Test", MB_OK );
  return 0;
 }

 
 getchar();
 lua_close( L);
 return 1;
}

 


 

额....这就是系列文章的好处:即使优快云把原来的弄丢了,我也可以根据上下文来重写丢失的文章。

如你所见,我将关键点全部标记为粗体。并且给出了足够的注释。让我们来一条条梳理:

1、LuaC_MessageBox( "Last is ShowMessage! This is real MessageBox!");
这就是Lua脚本调用自己写的函数。让我们接着看如何实现这个函数的。

2、int LuaC_MessageBox( lua_State *L)
这个就是函数的实体了,要想使自己的函数被Lua脚本所用,必须遵守以下规则:
        使用 int 函数名( lua_State *L) 的形式来声明和定义函数。
        使用Lua的堆栈来进行参数交换。
        调用Lua的注册函数。

3、关于第2个规则,Lua是按照  __fastcall 的规则传递参数的,也就是从左到右一个个传。
Lua压栈的顺序是:首先将函数压栈,然后将参数压栈。执行完毕后,将参数和函数都出栈,然后将返回值按顺序压栈。当然,还有很多类似的参数交换规则,不过别急我们慢慢来。

4、retrun 0;
在C函数中的返回值 指的是返回值的数量。因为Lua脚本是支持多个返回值的,结合上条和这条规则来实现。

5、C文件中的函数体编写完了,还需要将该函数进行注册,如:
lua_register( L, "LuaC_MessageBox", LuaC_MessageBox);
第二个参数为Lua脚本中的函数名,第三个为C文件中的函数名。

6、还有什么是我没涉及到的?返回值压栈!但是我想暂时不谈这个问题,因为我将(已经)在笔记四中详细讨论。所以,先熟悉这个基本流程。

7、OK。重写的好处在于:我可以直接把笔记四的东西搬过来。哈哈,又一次时间旅行。
Lua中有很多把各类返回值压栈的函数,只要你在Lua参考手册中搜索“lua_push”,你可以得到如下结果:
lua_pushboolean
lua_pushinteger
lua_pushfstring
lua_pushlstring
lua_pushnil
lua_pushnumber
.....
有很多这样的函数,解释可以参看参考手册(一定要看!)。
但是在这个例子中,我们没有返回值,所以retrun 0。

发表于 @ 2007年12月28日 09:48:00|评论(0)|编辑

新一篇: Lua学习笔记三--表的应用 | 旧一篇: Lua学习笔记一



Lua脚本语言0基础教程

原创 Lua学习笔记五--真正的入门:编写Lua扩展库收藏

通 过前面4次的学习,我们已经具备了一些基本知识:1、使用Lua脚本语法2、编写Lua函数和C函数,并使他们交互3、表和其他类型的参数的应用4、处理 函数的返回值的方法很好,很强大。这些知识足以开启Lua世界的大门,现在让我们来真正的进入Lua的世界。本节的目的:写一套操作动态浮点数组的函数, 并把他们封装成库,侧重点为编写函数库的基本套路阅读全文>

发表于 @ 2008年01月07日 15:18:00|评论(1)|收藏

原创 Lua学习笔记四--返回值和UserData收藏

通过上一节的知识,我们学会了如何利用表来作为参数,这样我们能实现的功能更多了。但是有一点是没有涉及到的,那就是返回值,而返回值的讨论不能不提userdata类型。本节的目的:讨论如何处理Lua返回值和Userdata类型的应用。阅读全文>

发表于 @ 2008年01月05日 16:36:00|评论(0)|收藏

原创 Lua学习笔记三--表的应用收藏

通 过上一节的知识,我们可以实现很多应用了,但是在GUI领域,实在有太多的变量--x,y,z,w,h,bitmap,algi,d1,d2,d3, dp1,dp2,dp3,whatever...,而Lua的栈默认元素上限为20个,所以必须掌握Lua特有的数据类型--表的应用。本节的目的:在上 节的基础上,加入表的应用。侧重点为用表来作为函数参数。阅读全文>

发表于 @ 2007年12月28日 11:38:00|评论(5)|收藏

原创 Lua学习笔记二--在Lua中使用自己的C函数收藏

OK,上次我们掌握了如何在Lua脚本中编写一个函数,并在C文件中接应它。现在让我们来学习另外一种交互方式。本节的目的:在Lua脚本中调用自己写的函数。侧重点为自己编写可以被Lua脚本使用的C函数的规则。阅读全文>

发表于 @ 2007年12月28日 09:48:00|评论(0)|收藏

原创 Lua学习笔记一收藏

该 系列文章将纪录我在学习Lua时碰到的一些问题和得出的心得体会,适合没有任何Lua基础的朋友看。最终目的是想在基于Allegro图像库的GUI构建 中应用Lua,也许有的朋友的最终目的是在Web中应用Lua--或者别的目的--不过我想在通往最终应用的路途中,总会有一些共通的地方。希望我这些文 字对你有所帮助。本节的目的在于在VS2005中搭建一个用于测试Lua的环境。侧重点为C/C++与Lua的交互--在CPP文件中应用Lua脚本。阅读全文>

发表于 @ 2007年12月25日 15:30:00|评论(2)|收藏

原创 在VS2005中配置LUA收藏

本文介绍了如何在VS2005中配置LUA使用环境、配置LUA系统环境变量、独立使用Lua解释器和编译器。阅读全文>

发表于 @ 2007年12月11日 17:20:00|评论(3)|收藏

转载 [转载]《通过例子学习Lua》系列文章收藏

本文转载《通过例子学习Lua系列》。该文可以作为将《PIL5.0中文版》的后续学习资料,该文章初步描述了如何将pil中所掌握的LUA语法转化为能与自己程序协作的方法。阅读全文>

发表于 @ 2007年12月11日 14:48:00|评论(0)|收藏

【Lua 语言】Lua 调用 C 函数 Lua 提供了调用 C 函数的接口,这样我们可以开心地用 C 来写一些底层的代码供 Lua 调用了。调用方式如下:1. 新建 C 源文件,将需要被 Lua 调用的函数实现如下:static int l_add(lua_State *L){    return 0;}... 阅读详情

相关推荐

Lua与c交互原理

介绍 Lua与C交互的高级用法,进阶到高级、资深必知必会的知识点

lpl312905509的博客 1242

Lua使用心得(1)

 这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口、组件,随便你怎么叫),希望能用脚本来控制主程序的行为。这实际上也是一种把业务分离,用脚本控制的架构,可能有些人把这种脚本叫做业务引擎,工作流等。 为什么选择lua?因为它是一个能和C/C++结合得很紧的脚本语言,而我们的程序是用VC++ 写

一雨田的专栏 9911

C 函数中如何保存 Lua 的数据

在前面的文章中,C 函数操作的数据的生命周期都是在该函数执行期间。C 语言中无法保存普通的 Lua 值。如果 Lua 库函数中使用了全局变量或静态变量来保存一些数据,会导致该库在多个 lua_State 中使用受到约束。(因为每个 lua_State 间是相互独立的,而 C 函数中使用的全局变量和静态变量却是共用的,这里会出现数据混乱问题。注册表上值经过前面文章的学习,可以知道 Lua 内部存储 “非局部数据” ,则通过 “全局变量” 和 “非局部变量”。

江澎涌的博客 1225

lua调c动态库

Lua脚本调c动态库函数时开始调不成功,通过Lua官方的Mail List才知道:c动态库里的注册函数和Lua脚本的打开库的方式要一致。 1. c动态库的代码: static int lua_msgbox(lua_State* L) {     const char* message = luaL_checkstring(L, 1);     const char* caption

sumoyu的专栏 1964

Lua 函数

介绍Lua函数基本原理及应用

lpl312905509的博客 903

Lua 中编写 C 函数的一些便捷技巧

使用 Lua 时,在编写 C/C++ 函数经常需要对栈进行交互,而这中间更多的操作和数组、字符串相关。Github传送门(如果对你有所帮助或喜欢的话,赏个star吧,码字不易,请多多支持)如果觉得本篇博文对你有所启发或是解决了困惑,。公众号搜索 “江澎涌”,更多优质文章会第一时间分享与你。

江澎涌的博客 1148

封装Lua for C#

http://blog.youkuaiyun.com/rcfalcon/article/details/5583095 今天翻了一下google,翻出GameDev.net上一篇老外的文章,叫《Using Lua with C#》,看了一下,它的方法不错。(改天考虑翻译这篇文章),不过他的示例代码实在是太太太冗长了,大部分是生成函数介绍和函数帮助文档等,直接忽略。把它最核心的东西拿过来,然后自己封装

没有什么能够阻挡,我对自由的向往! 643

Lua学习笔记--C调用Lua

Lua是一种嵌入式语言,可以很好的嵌入其他应用程序。lua为我们提供了一组灵活的C API,使C代码能够很好的与Lua进行交互。包括读写Lua全局变量,调用Lua函数,运行Lua代码,注册C函数反过来供Lua调用。简单的说,C能调用Lua,反过来Lua也能调用C。真的是灰常强大灵活的脚本!!现在,先来学习一下怎么用C调用Lua。 其实最简单的我们已经做过了,通过一个dofile,运行一个lua脚

puppet_master的专栏 2556

易语言lua脚本实现多线程游戏窗口控制

Lua本身并不真正支持抢占式多线程,必须借助宿主语言,这里采用易语言真正实现lua脚本的多线程操作,完整演示了lua实现一键登录到退出

511遇见 4008

Lua 调用 C 模块中的函数

在之前 “Lua 模块与包” 的文章中,介绍了 Lua 通过require是如何引入一个模块的,其中 C 模块并未展开分享。今天就分享如何构建和使用一个 C 模块作为 Lua 的引入模块。Lua 通过注册 C/C++ 函数,进行感知 C/C++ 函数。一旦 C/C++ 函数用 Lua 表示和存储,Lua 就会通过对其地址的直接引用来调用,Lua 对这些 C/C++ 函数的调用不再依赖于函数名、包的位置以及可见性规则。Github传送门(如果对你有所帮助或喜欢的话,赏个star吧,码字不易,请多多支持)

江澎涌的博客 873

Lua C API 研究 —— 基础篇

对 Lua C API 进行基础的介绍 总结了 C 调用 Lua 函数的栈操作过程 总结了 Lua 调用 C 函数的栈操作过程 总结了 Lua 加载 C 链接库的过程

AlexWoo0501的博客 4319

在Lua中使用自己的C函数

-------以下是Lua脚本-------- --test.lua LuaC_MessageBox( "Last is ShowMessage! This is real MessageBox!"); ---------通过LuaEdit语法测试才出鬼了-------------- //------------以下是test.cpp文件---------------- //======

gumingyaotangwei 的专栏 871

Microduck机器鸭开源AI项目:本地部署与模型微调实战指南

开源AI模型的本地化部署与定制化训练正成为开发者关注的技术趋势。与依赖云端API的在线服务不同,本地部署允许用户将模型权重下载至自有GPU环境,通过命令行或WebUI完成推理、批量任务处理及API集成,在数据隐私、离线使用和接口稳定性方面具备天然优势。模型微调则基于预训练权重,利用领域数据训练特定任务,从而提升生成质量与业务适配度。这一技术路径广泛应用于内容生成、智能对话、自动标注等场景,尤其适合消费级显卡开发者、数据敏感型团队及二次开发研究者。Microduck(机器鸭)作为近期预售火爆的开源项目,围绕“

weixin_29082143的博客 412

[LUA学习笔记03]LUA函数和C函数的相互调用

  1. 简介LUA和C之间的函数调用也是基于上一节提到的栈。 1.1 从C程序调用LUA函数LUA的函数和普通变量一样也是First Class Variable类型,可以看作函数指针变量参与栈操作。因此调用过程分为如下几个步骤: 请求LUA函数(指针)入(GLOBAL)栈。 将函数需要的参数入栈,入栈顺序按照参数被声明的顺序。 告知LUA虚

MrTECHNO的编程日记 7953

基于 openEuler 24.03 LTS 源码编译安装 Zabbix 7.4

Zabbix是一款开源的企业级分布式监控系统,支持网络、服务器、应用等多种IT资源的监控。核心功能包括数据采集、告警通知、可视化展示等,采用Server/Agent架构,支持多种操作系统。本文详细介绍了在openEuler 24.03系统上部署Zabbix 7.4.2的完整流程,包括环境准备、MySQL配置、PHP/Apache安装、Zabbix编译安装等步骤,为构建企业级监控系统提供了实践指导。

广然笔记 1190

Open3D:Win10 + VS2017配置Open3D(C++、python)

一、下载源码 地址:https://github.com/intel-isl/Open3D 1.1 克隆源码【笔者的源码路径为D:\Open3D\Open3D】 1.2 切换版本【笔者的版本为0.8.0】 1.3 更新子模块【用于获取第三方库!很重要!】 二、CMake编译 2.1 设置路径 【source code: D:\Open3D\Open3D;build binaries: D:\Open3D】 【笔者设置CMAKE/CMAKE_INSTALL_PREFIX的路径为D:/Open.

累了就要打游戏 1万+

Lua学习笔记二之C中调用Lua

虽然之前看过《Lua程序设计》(第二版)这本书,但对C与Lua交互的部分,一直不是很理解。最近想系统学习和深入理解C与Lua的交互(实质是想通过这个,进一步阅读Lua源码,:)),因此又看了一下这本书的第4部分,下面是在学习C中调用Lua的全局变量、table和函数的笔记以及自己的理解,其中学习过程中的写的代码可以从我的github下载。      0、Lua与C有两种交互形式。在第一种

MaximusZhou的专栏 2456

基于Agent与大模型的性能测试脚本自动化生成实践

性能测试是软件质量保障的关键环节,其核心在于模拟真实用户负载以评估系统在高并发下的表现。传统脚本编写依赖人工,效率低下且易出错。通过引入智能体(Agent)与大语言模型(LLM)技术,可实现从自然语言描述或接口文档到可执行脚本的自动化转换。Agent负责任务规划与工具调用,LLM则提供强大的意图理解与代码生成能力,二者结合能精准解析测试场景、自动处理参数化与接口关联等复杂逻辑。该技术方案显著提升了脚本生成效率与准确性,尤其适用于持续集成、海量接口回归等需要快速构建测试场景的工程实践。本文以JMeter和Lo

weixin_28718769的博客 259

Lua中调用C函数

Lua中调用C函数Lua利用一个虚拟的堆栈来给C传递值或从C获取值1. C函数作为应用程序的一部分2. C函数库成为Lua的模块Lua中调用C函数Lua调用c模块 https://www.cnblogs.com/sifenkesi/p/3876745.html https://blog.youkuaiyun.com/liu943367080/article/details/90909005 Lua利用一个虚拟的堆栈来给C传递值或从C获取值 Lua利用一个虚拟的堆栈来给C传递值或从C获取值。每当Lua调用C函数,都会获得

宁静致远的博客 3922

基于MATLAB的鲁棒主成分分析(Robust PCA)图像去噪

鲁棒主成分分析(Robust PCA)是一种有效的图像去噪方法,它能够在保持图像细节的同时去除噪声。本文将介绍如何使用MATLAB实现基于鲁棒PCA的图像去噪,并提供相应的源代码。它假设噪声是随机的、高斯分布的,并将图像分解为一个低秩矩阵和一个稀疏矩阵的和。低秩矩阵表示图像的结构和纹理信息,稀疏矩阵表示图像中的噪声和细节信息。接下来,我们将图像矩阵减去均值,得到规范化的图像矩阵。然后,我们将灰度图像转换为矩阵形式,并计算图像的均值。通过分离出低秩矩阵和稀疏矩阵,我们就得到了去噪后的图像和残差图像。

DevRevolt的博客 1125

CAN总线入门(硬件部分)

这篇博客讲述CAN总线入门知识。

记得诚 1万+

Lua与C语言的互相调用

Lua底层是C语言开发的,在设计时就考虑到了与C语言的互操作性。可以把Lua作为一种独立的语言或者作为一种嵌入式的脚本语言。有许多游戏和其他应用程序利用Lua作为脚本语言。 在本文中,我们将重点探讨如何将Lua嵌入到C或C++应用程序中,作为胶水脚本存在。虽然此文只关注C语言的API,但在LuaDardo项目中,这些C API并没有做根本改变,只是在命名规范上做了适应Dart语言的变化(驼峰命名法)。简单说,LuaDardo基本是兼容这些API的。 使用 C API Lua的C语言API是高效和轻量级的。在

编程之路的专栏 7724

学Simulink——基于AI融合与智能调度的场实例:联邦学习支持的多卫星协同通信建模

本文介绍了一种基于联邦学习的多卫星协同通信Simulink建模方法。系统采用"星-星协同+星-地协调"架构,每颗卫星本地训练LSTM链路预测模型,地面中心通过FedAvg算法聚合模型参数。建模过程包括卫星通信模型构建、联邦学习机制设计、协同决策系统开发等步骤,支持隐私保护、高效协同和智能决策。仿真结果表明,该方法在预测准确率(89%)、吞吐量(56.7Mbps)等方面优于独立训练模式,接近集中式训练性能。该方案为大规模卫星星座的智能协同提供了仿真验证平台,未来可拓展去中心化联邦学习、异构

xiaoheshang_123的博客 209

Lua调用C函数 -- Qt实现

Lua调用C函数 – Qt实现 第一种方式:C函数作为应用程序的一部分,使用lua来调用 流程: 1.应用程序加载Lua脚本 2.Lua脚本中调用C函数中 程序: luaCallC.pro #------------------------------------------------- # # Project created by QtCreator 2019-12-18T14:24:19 # #------------------------------------------------- QT

hanmingjunv5的博客 9138

Win11此电脑怎么放在桌面上?Win11此电脑如何显示在电脑桌面上?

相信用习惯Win10的用户都喜欢电脑电脑桌面上的此电脑,但是很多用户更新完Win11正式版以后,发现桌面只有回收站和Microsoft Edge图标,没有此电脑。那么,Win11此电脑要如何显示呢?下面小编为大家简单介绍一下操作方法!5、桌面图标设置窗口,点击勾选计算机,然后点击确定,桌面就可以显示此电脑图标了。1、桌面空白处,点击右键,在打开的菜单项中,选择显示设置;4、个性化 - 主题,相关设置下,点击桌面图标设置;3、右侧点击主题(安装、创建、管理);2、设置窗口,左侧点击个性化;

shengyin714959的博客 13万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 一颗璀璨的月光宝石——Lua
下一篇: Lua - 调试接口
skyremember
博客等级 码龄20年 204粉丝 484原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值