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

Lua学习笔记二

 
阅读更多

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学习笔记.txt

    lua学习笔记

    lua学习笔记

    自己学习lua记得笔记,做任务用的~很基础的东西,想要的拿走,免费

    cocos2dx_lua开发笔记

    【cocos2dx_lua开发笔记】是一篇个人实践总结,主要涵盖了使用cocos2dx_lua进行游戏开发的一些关键点,包括...通过学习和理解这些笔记,开发者能够更好地理解和运用cocos2dx_lua进行游戏场景、UI元素和动画效果的构建。

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

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

    lua基础学习笔记

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

    lua基础笔记

    2. ** 表与元表 **:表是Lua的核心数据结构,可以用来表示数组、集合、对象等。元表是Lua的特色之一,它可以关联到任何表,并定义表的行为,比如如何进行索引和比较操作。 3. ** 函数与闭包 **:Lua中的函数是一等...

    cocos2dx-lua 笔记

    二、Lua 语言入门 Lua 是一种轻量级的脚本语言,语法简洁,易于学习。在 Cocos2d-x 中,Lua 被用于编写游戏逻辑,如场景切换、角色行为等。理解 Lua 的基本语法,如变量、函数、表(数组)和面向对象编程是掌握 ...

    Lua学习笔记之表达式

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

    lua (vc环境)学习笔记

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

    Lua的table元表自我学习笔记

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

    Lua使用笔记

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

    Lua学习笔记之类型与值

    Lua的类型与值的学习笔记为我们提供了对这些基础知识的全面了解,对于Lua新手来说是一份宝贵的资料。通过这些知识点的学习,开发者可以更加有效地编写Lua程序,并在日常开发中避免一些常见错误。

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

    Lua是一种轻量级的嵌入式脚本语言,它的语法简洁且易于学习,而C++则以其强大的性能和灵活性著称。将两者结合可以让我们在C++程序中利用Lua的便利性编写脚本,进行逻辑控制或动态行为。 一、Lua与C++的交互 1. Lua ...

    Lua基础应用笔记

    ### Lua基础应用知识点详解 #### 一、Lua简介与特性 ...以上内容覆盖了Lua的基本语法和常用操作,是学习Lua的入门必备知识点。对于从事Unity3D开发或者对Lua感兴趣的朋友来说,掌握这些内容将极大地提高编程效率。

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

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

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

    Lua是一种轻量级的脚本语言,具有易于嵌入到应用程序中、支持面向过程和函数式编程、拥有灵活的变量作用域等特点。本文将介绍Lua中函数的基础用法、变长参数、closure(闭包)、以及select函数的使用,并结合代码...

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

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

    基于Java与HTML/CSS/Lua的Spring实战书籍学习笔记与源码分析

    本项目为《Spring实战》英文原版书籍的Java实现学习笔记与源码分析,包含186个文件,主要采用Java语言编写,辅以HTML、CSS、Lua等语言。文件类型多样,涵盖163个Java源文件、5个HTML文件、2个Git忽略文件、2个...

Global site tag (gtag.js) - Google Analytics