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

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

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

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

 我不知道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
//================================================================================================================
#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;
}

 


 

额....这就是系列文章的好处:即使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。

发表于 @ 2007年12月28日 09:48:00|评论(0<script type="text/javascript">AddFeedbackCountStack("1998576")</script>)|编辑

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



Lua脚本语言0基础教程

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

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

发表于 @ 2008年01月07日 15:18:00|评论(1<script type="text/javascript">AddFeedbackCountStack("2028847")</script>)|收藏

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

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

发表于 @ 2008年01月05日 16:36:00|评论(0<script type="text/javascript">AddFeedbackCountStack("2026896")</script>)|收藏

原创 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<script type="text/javascript">AddFeedbackCountStack("1999192")</script>)|收藏

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

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

发表于 @ 2007年12月28日 09:48:00|评论(0<script type="text/javascript">AddFeedbackCountStack("1998576")</script>)|收藏

原创 Lua学习笔记一收藏

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

发表于 @ 2007年12月25日 15:30:00|评论(2<script type="text/javascript">AddFeedbackCountStack("1966568")</script>)|收藏

原创 在VS2005中配置LUA收藏

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

发表于 @ 2007年12月11日 17:20:00|评论(3<script type="text/javascript">AddFeedbackCountStack("1929815")</script>)|收藏

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

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

发表于 @ 2007年12月11日 14:48:00|评论(0<script type="text/javascript">AddFeedbackCountStack("1929393")</script>)|收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值