网普科技
网普管理员
网普科技人民公仆
积分 3080
发贴 2863
注册 2004-6-26 来自 网普科技
状态 离线
|
|
2007-4-6 01:48 PM |
|
网普科技
网普管理员
网普科技人民公仆
积分 3080
发贴 2863
注册 2004-6-26 来自 网普科技
状态 离线
|
#2 如何使用Lua扩展C/C++应用系列1
作者:buxiu 转自:Lua中文网站(www.luachina.net)
Lua是轻量级的脚本语言,可以很方便用来扩展C/C++应用程序,下面我们通过几个简单的例子来学习Lua如何扩展C/C++的。
首先,你需要安装Lua,如果你使用windows操作系统你可以下载别人编译好了的二进制程序即可使用,当然你也可以下载Lua源代码(http://www.lua.org/download.html)使用你喜欢的编译器编译成二进制文件来使用.如果你使用Linux,你只需要下载源代码解压缩文件文件后执行make,然后作为root用户执行make install即可.Unix操作系统,你下载源代码,通过修改配置文件INSTALL中编译选项后执行和Linux下类似的操作即可.
当然如果你想在任意路径下都可以使用Lua,类Unix平台别忘了修改.profile文件加入你的环境变量;windows下则需要设置环境变量.
第一个程序:
这个程序很短小,但能说明问题,首先说明几点:
1. 调用lua_open()将创建一个指向Lua解释器的指针。
2. lua_baselibopen()函数加载Lua库。
3. 使用lua_dofile()加载脚本并运行脚本。
4. lua_close()来关闭Lua指向解释器的指针。
将下面的代码保存为luatest.cpp,如果你喜欢用C而不是C++,需要保存文件为luatest.c并且把extern去掉。
代码:
#include <stdio.h>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/* the Lua interpreter */
lua_State* L;
int main ( int argc, char *argv[] )
{
/* initialize Lua */
L = lua_open();
/* load Lua base libraries */
lua_baselibopen(L);
/* run the script */
lua_dofile(L, "test.lua");
/* cleanup Lua */
lua_close(L);
return 0;
}
下面是一个简单的Lua脚本:
-- simple test
代码:
print "Hello, World!"
确认它能运行。
编译:
使用你喜欢的编译器编译上面保存的C/C++文件,下面以Linux为例:
命令行键入:
代码:
g++ luatest.cpp -llua -llualib -o luatest
如果没有错误的话,运行程序:
代码:
./luatest
程序应该打印出:Hello, World!
如果你不是Linux操作系统,使用的是Vc++编译器,你需要:
1. 创建一个新的win32控制台应用工程。
2. 将文件luatest.cpp添加到你的工程中。
3. 到Project, Settings点击Link页。
4. 添加lua+lib.lib到Object/library modules列表中。
5. 按F7编译程序。
运行程序以前,你需要确保lua+lib.dll文件放在windows可以找到的地方,将这个文件从C:\Program Files\Lua-5.0拷贝到Visual C++ project目录,如果编译没有错误的话,现在可以Ctrl+F5运行程序了。
通过这个例子我们已经踏上了在C/C++中嵌入Lua的第一步,下一篇我们介绍如何在C/C++中调用Lua函数并将函数的返回值传递给C/C++程序。
|
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。
网普科技,优质美国主机服务!
美国Linux主机,美国虚拟主机
支持PHP+MYSQL+cPanel+EMAIL
为用户负责,拒绝反动、赌博及色情内容! QQ:126818
发送QQ消息 |
|
2007-4-6 01:49 PM |
|
网普科技
网普管理员
网普科技人民公仆
积分 3080
发贴 2863
注册 2004-6-26 来自 网普科技
状态 离线
|
#3 如何使用Lua扩展C/C++应用系列2
这一篇接着第一个篇"Hello, World!",介绍如何在Lua中定义函数然后在C/C++中调用他,这将涉及到参数传递,返回值,全局变量等。
Lua中定义函数非常简单,以关键字function开头,后面跟上函数名,参数列表,函数体,函数定义以end结尾。Lua中函数可以传递多个参数也可有多个返回值。
下面有个简单的Lua函数,两个数字相加返回两者的和。
-- add two numbers
代码:
function add ( x, y )
return x + y
end
在上一篇中我们讲到调用lua_dofile()将加载并运行Lua代码,本节中我们的Lua脚本仅仅定义了一个函数,调用lua_dofile()函数将使得我们的C/C++程序可以访问Lua中的函数了。
Lua 中的函数可以接受多个参数,也可以有多个返回值。这是通过stack来完成的。调用一个函数时,首先将函数放到栈顶,接着按顺序放入函数的参数,当我们调用函数lua_call()之后,函数的返回值已经放在栈顶了,这些步骤在下面的luaadd()函数中可以看到。
说明:
1. 调用lua_getglobal()将add()函数压入栈顶。
2. 第一个参数x,通过调用lua_pushnumber()入栈。
3. 再次调用lua_pushnumber()将第二个参数入栈。
4. 使用lua_call()调用Lua函数。
5. 调用lua_tonumber()从栈顶取得函数的返回值。
6. lua_pop()移除栈顶的值。
将下面的代码保存为luaadd.cpp,如果你喜欢用C而不是C++,需要保存文件为luatest.c并且把extern去掉。
代码:
#include <stdio.h>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/* the Lua interpreter */
lua_State* L;
int luaadd ( int x, int y )
{
int sum;
/* the function name */
lua_getglobal(L, "add");
/* the first argument */
lua_pushnumber(L, x);
/* the second argument */
lua_pushnumber(L, y);
/* call the function with 2
arguments, return 1 result */
lua_call(L, 2, 1);
/* get the result */
sum = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
return sum;
}
int main ( int argc, char *argv[] )
{
int sum;
/* initialize Lua */
L = lua_open();
/* load Lua base libraries */
lua_baselibopen(L);
/* load the script */
lua_dofile(L, "add.lua");
/* call the add function */
sum = luaadd( 10, 15 );
/* print the result */
printf( "The sum is %d\n", sum );
/* cleanup Lua */
lua_close(L);
return 0;
}
编译:
Linux平台,键入命令:
代码:
g++ luaadd.cpp -llua -llualib -o luaadd
运行程序:
代码:
./luaadd
如果正常的话程序应该显示:"The sum is 25"
如果你不是Linux操作系统,使用的是Vc++编译器,你需要:
1. 创建一个新的win32控制台应用工程。
2. 将文件luaadd.cpp添加到你的工程中。
3. 到Project, Settings点击Link页。
4. 添加lua+lib.lib到Object/library modules列表中。
5. 按F7编译程序。
运行程序以前,你需要确保lua+lib.dll文件放在windows可以找到的地方,将这个文件从C:\Program Files\Lua-5.0拷贝到Visual C++ project目录,如果编译没有错误的话,现在可以Ctrl+F5运行程序了。
关于全局变量:
如上面我们所看到的,lua_getglobal()将Lua的一个全局变量放至栈顶,假如我们的脚本包含一个全局变量z,下面这段代码将获取z的值:
代码:
lua_getglobal(L, "z");
z = (int)lua_tonumber(L, 1);
lua_pop(L, 1);
与之对应的lua_setglobal()用来设置Lua的一个全局变量的值,下面的这段代码将全局变量z的值设置为10
代码:
lua_pushnumber(L, 10);
lua_setglobal(L, "z");
注意,不需要在你的Lua脚本中显式的全局变量,如果全局变量不存在,lua_setglobal()将创建一个新的全局变量。
|
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。
网普科技,优质美国主机服务!
美国Linux主机,美国虚拟主机
支持PHP+MYSQL+cPanel+EMAIL
为用户负责,拒绝反动、赌博及色情内容! QQ:126818
发送QQ消息 |
|
2007-4-6 01:49 PM |
|
网普科技
网普管理员
网普科技人民公仆
积分 3080
发贴 2863
注册 2004-6-26 来自 网普科技
状态 离线
|
#4 如何使用Lua扩展C/C++应用系列3
这次与第二篇文章相反,介绍如何在Lua中调用C/C++函数,首先,我们用C/C++创建一个函数并告诉Lua解释器,然后在Lua中调用这个函数并使用函数的返回值。
定义一个C/C++函数:
要想C/C++中的函数能被Lua调用,函数定义必须这样:
代码:
typedef int (*lua_CFunction) (lua_State *L);
也就是说,函数必须以Lua解释器作为参数,并且返回值为int类型。既然Lua解释器作为函数的参数,那么实际上函数可以从栈中取得任意多个参数。下面我们将看到,返回的整数值代表入栈的值的数目。如果有一个C/C++函数,你想在Lua中调用他,很容易封装一下就可以满足上述要求。
下面的C++的average函数例子中,可以清楚地看到Lua中调用C/C++函数是如何实现的。
1. lua_gettop()返回栈顶的下标索引,由于Lua中栈的下标从1开始,这个返回值实际上也就是函数参数的个数。
2. For循环计算各个参数总和。
3. Average的参数是通过调用lua_pushnumber()入栈的。
4. 然后参数之和被入栈。
5. 最后,函数返回值为2,表明有两个返回值,并且已经入栈。
函数被定义之后,我们必须告诉Lua编译器他的存在,这在main()函数中,在Lua解释器被初始化,类库加载之后完成的。
将下面的代码保存为luaavg.cpp,如果你喜欢用C而不是C++,需要保存文件为luatest.c并且把extern去掉。
代码:
#include <stdio.h>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/* the Lua interpreter */
lua_State* L;
static int average(lua_State *L)
{
/* get number of arguments */
int n = lua_gettop(L);
double sum = 0;
int i;
/* loop through each argument */
for (i = 1; i <= n; i++)
{
/* total the arguments */
sum += lua_tonumber(L, i);
}
/* push the average */
lua_pushnumber(L, sum / n);
/* push the sum */
lua_pushnumber(L, sum);
/* return the number of results */
return 2;
}
int main ( int argc, char *argv[] )
{
/* initialize Lua */
L = lua_open();
/* load Lua base libraries */
lua_baselibopen(L);
/* register our function */
lua_register(L, "average", average);
/* run the script */
lua_dofile(L, "avg.lua");
/* cleanup Lua */
lua_close(L);
return 0;
}
一个简单的Lua脚本,调用C/C++函数,并打印其返回值,保存为avg.lua:
代码:
-- call a C++ function
avg, sum = average(10, 20, 30, 40, 50)
print("The average is ", avg)
print("The sum is ", sum)
编译:
Linux平台,键入命令:
代码:
g++ luaavg.cpp -llua -llualib -o luaavg
运行程序:
代码:
./ luaavg
如果正常的话程序应该显示:"The sum is 25"
如果你不是Linux操作系统,使用的是Vc++编译器,你需要:
1. 创建一个新的win32控制台应用工程。
2. 将文件luaavg.cpp添加到你的工程中。
3. 到Project, Settings点击Link页。
4. 添加lua+lib.lib到Object/library modules列表中。
5. 按F7编译程序。
运行程序以前,你需要确保lua+lib.dll文件放在windows可以找到的地方,将这个文件从C:\Program Files\Lua-5.0拷贝到Visual C++ project目录,如果编译没有错误的话,现在可以Ctrl+F5运行程序了。
关于错误处理:
如果你看过Lua API文档,你会发现在上面的average函数中并未进行参数检查,这样做的目的是为了更容易解释问题,但是在一个实际的程序中错误检查是必要的。在上面的例子中我们至少应该确保每一个参数是一个整数,可以用下面代码实现:
代码:
if (!lua_isnumber(L, i)) {
lua_pushstring(L, "Incorrect argument to 'average'");
lua_error(L);
}
这样易于以后的调试。在使用两种语言进行开发的时候这是非常重要的一点,否则你会发现你将陷于忙于两种语言之间进行调试。
|
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。
网普科技,优质美国主机服务!
美国Linux主机,美国虚拟主机
支持PHP+MYSQL+cPanel+EMAIL
为用户负责,拒绝反动、赌博及色情内容! QQ:126818
发送QQ消息 |
|
2007-4-6 02:09 PM |
|
茱莉娅
THE BODY SHOP美容顾问
茱莉娅美体小铺
积分 3080
发贴 2863
注册 2009-5-21
来自 茱莉娅美体小铺
状态 离线
|
|
2007-4-6 02:09 PM |
|
|