`
javababy1
  • 浏览: 1224847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

我不知道CSDN把笔记二弄哪去了,这是第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
//================================================================================================================
#pragmacomment( 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;
}


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

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

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。

分享到:
评论

相关推荐

    自我学习笔记--LUA;python:网络编程等

    【标题】中的“自我学习笔记--LUA;python:网络编程等”表明这是一份包含LUA和Python语言,特别是关于网络编程的学习资料。LUA和Python都是编程语言,广泛应用于游戏开发、脚本编写、自动化任务以及网络服务等领域。 ...

    lua (vc环境)学习笔记(学习代码)

    **lua (VC环境) 学习笔记** 在深入学习lua编程语言并将其应用于Microsoft Visual C++(VC环境)时,我们需要了解几个关键知识点。lua是一种轻量级的脚本语言,设计目标是作为嵌入式语言,使得游戏开发、系统管理、...

    G-series Lua API 参考文档.zip

    在《G-series Lua API 参考文档.docx》中,通常会包含API函数的详细说明、使用示例、常见问题解答等内容,是学习和开发的必备资料。而《新建文本文档.txt》可能是开发者在学习过程中随手记录的笔记或者待解决的问题...

    lua基础学习笔记

    ### Lua基础学习笔记 #### 一、Lua简介与特点 Lua是一种轻量级且高效的脚本语言,广泛应用于游戏开发、网页应用、图形界面等领域。对于已有其他编程语言基础的学习者来说,掌握Lua通常较为迅速。Lua的设计哲学是...

    cocos2dx-lua 笔记

    在 Lua 中,合理使用局部变量、避免全局变量,以及优化循环和算法,都可以提高游戏性能。此外,理解内存管理和垃圾回收机制也至关重要。 七、持续学习与社区资源 Cocos2d-x 官方论坛、GitHub 仓库、StackOverflow ...

    Cocos2D-X开发学习笔记-时间调度schedule函数的使用

    本篇学习笔记主要关注的是Cocos2D-X中的时间调度机制,特别是如何使用`schedule`函数进行周期性任务的执行。 在Cocos2D-X中,时间调度是游戏循环的重要组成部分,它允许开发者在特定的时间间隔内执行某些函数或操作...

    lua基础笔记

    luaL_newstate和luaL_openlibs函数可以创建和初始化一个Lua状态机,然后通过lua_pushfunction将C函数注册到Lua环境中。 9. ** 脚本和程序交互 **:Lua脚本可以调用宿主程序的函数,反之亦然,这种交互性使得Lua成为...

    Lua的table元表自我学习笔记

    Lua的table元表自我学习笔记分享。--lua元表总结 --1、__index的运用 (调用table的一个不存在的索引时,会使用到元表的__index元方法,搜索元表是否也有改索引,__index可以是一个函数也可是一个table。)

    个人对c++使用lua的一些笔记

    6. 错误处理:在调用Lua函数时,可能遇到错误,如语法错误、运行时错误等。C++需要捕获这些错误,通常通过检查`lua_pcall`的返回值,或者使用`lua_gettop`和`lua_tostring`检查栈上的错误信息。 7. 调试:可以使用`...

    lua (vc环境)学习笔记

    【Lua (VC环境) 学习笔记】 Lua是一种轻量级的、开源的脚本语言,主要用于嵌入式系统和游戏开发。它以其简洁的语法、高效性和易于集成的特点受到广泛欢迎。在VC(Visual C++)环境中使用Lua,可以为C++应用程序提供...

    Lua使用笔记

    这个"Lua使用笔记"的压缩包包含了三个文件:hello3.lua、hello.lua和hello2.lua,这些文件很可能是 Lua 的示例代码或练习脚本,通过它们我们可以学习和理解 Lua 的基本语法和特性。 首先,我们来看一下 Lua 的基础...

    STEP-BY-STEP--LUA.zip_lua_lua脚本_step by step

    "Lua脚本语方学习笔记,作为学习lua的参考" 描述了这个压缩包的内容是针对Lua脚本的学习资料,以笔记的形式记录,旨在为学习者提供参考,辅助他们系统地学习和理解Lua语言。 **标签解读:** "lua lua脚本 step_by_...

    Lua基础应用笔记

    - Lua使用 `print()` 函数来进行输出操作。需要注意的是,在Lua中 `print` 后面的括号内无需加分号。例如: ```lua print("你好") ``` #### 三、数据类型与命名规范 ##### 1. 数据类型 - **number**:表示数值...

    vs2008_lua文档及代码

    "相关学习笔记"意味着可能包含作者或他人在学习过程中积累的经验、技巧和问题解决方案。 【标签】进一步强调了主题的焦点,即Lua语言、相关文档、VS2008集成环境和实际的代码实现。这四个标签提供了搜索和理解资源...

    lua2 我的学习资料lua2 我的学习资料lua2 我的学习资料lua2 我的学习资料lua2 我的学习资料

    在深入探讨Lua的知识点之前,我们先明确一下,"lua2 我的学习资料"这个标题和描述并没有提供具体的信息,可能意味着这是个人整理的学习笔记或者是某门课程的教学材料。"课程资源"标签暗示这可能是一个完整的教学体系...

    Lua学习笔记之表达式

    【Lua学习笔记之表达式】 在Lua编程语言中,表达式是构成程序的基本元素,用于表示计算或逻辑操作。表达式的结果可以是一个值,也可以是一个布尔值,这取决于执行的操作。下面我们将深入探讨Lua中的各种表达式类型...

    Lua初级编辑软件.zip

    - **C API**:Lua提供了C接口,允许C/C++程序直接调用Lua脚本,或者在Lua中调用C/C++编写的函数,实现脚本语言和原生代码的交互。 - **错误处理**:Lua通过异常处理机制来处理运行时错误,通常使用`error`函数抛出...

    Lua学习笔记之函数、变长参数、closure(闭包)、select等

    首先,Lua函数支持多返回值。例如,在使用`string.find`函数查找子串时,该函数会返回两个值,分别是被查找子串的开始索引和结束索引。如果子串未被找到,则会返回`nil`和`nil`。在Lua中,当函数调用是表达式中的...

    Lua学习笔记之类型与值

    userdata在Lua中用于更高级的编程,通常涉及到C语言扩展的使用。 6. function类型:Lua支持第一类函数,这意味着函数可以作为变量的值存在,可以被传递,也可以被作为其他函数的返回值。Lua的函数可以是内置的,也...

    Cocos2d-x学习笔记

    在学习Cocos2d-x的过程中,新手首先需要了解其基本概念和安装配置过程。下面将详细介绍如何通过Cocos2d-x的官方文档进行入门学习,以及一些基础的开发步骤。 首先,进入Cocos2d-x的官方网站,下载最新的开发包。...

Global site tag (gtag.js) - Google Analytics