免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3929 | 回复: 5
打印 上一主题 下一主题

C/C++中嵌入Lua--转自bbs.luachina.net [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-14 18:09 |只看该作者 |倒序浏览
Calling Lua Functions
这一篇接着第一个篇"Hello, World!",介绍如何在Lua中定义函数然后在C/C++中调用他,这将涉及到参数传递,返回值,全局变量等。
        Lua中定义函数非常简单,以关键字function开头,后面跟上函数名,参数列表,函数体,函数定义以end结尾。Lua中函数可以传递多个参数也可有多个返回值。
        下面有个简单的Lua函数,两个数字相加返回两者的和。
  1.         -- add two numbers

  2.         function add ( x, y )
  3.         return x + y
  4.                  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去掉。
  1. #include <stdio.h>;

  2. extern "C" {
  3.         #include "lua.h"
  4.         #include "lualib.h"
  5.         #include "lauxlib.h"
  6. }

  7. /* the Lua interpreter */
  8. lua_State* L;

  9. int luaadd ( int x, int y )
  10. {
  11.         int sum;

  12.         /* the function name */
  13.         lua_getglobal(L, "add");

  14.         /* the first argument */
  15.         lua_pushnumber(L, x);

  16.         /* the second argument */
  17.         lua_pushnumber(L, y);

  18.         /* call the function with 2
  19.            arguments, return 1 result */
  20.         lua_call(L, 2, 1);

  21.         /* get the result */
  22.         sum = (int)lua_tonumber(L, -1);
  23.         lua_pop(L, 1);

  24.         return sum;
  25. }

  26. int main ( int argc, char *argv[] )
  27. {
  28.         int sum;
  29.        
  30.         /* initialize Lua */
  31.         L = lua_open();

  32.         /* load Lua base libraries */
  33.         lua_baselibopen(L);

  34.         /* load the script */
  35.         lua_dofile(L, "add.lua");
  36.        
  37.         /* call the add function */
  38.         sum = luaadd( 10, 15 );

  39.         /* print the result */
  40.         printf( "The sum is %d\n", sum );

  41.         /* cleanup Lua */
  42.         lua_close(L);

  43.         return 0;
  44. }
复制代码

编译:
Linux平台,键入命令:
  1. g++ luaadd.cpp -llua -llualib -o luaadd
复制代码

运行程序:
  1. ./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的值:
  1. lua_getglobal(L, "z");
  2.         z = (int)lua_tonumber(L, 1);
  3.         lua_pop(L, 1);
复制代码


与之对应的lua_setglobal()用来设置Lua的一个全局变量的值,下面的这段代码将全局变量z的值设置为10
  1. lua_pushnumber(L, 10);
  2.         lua_setglobal(L, "z");
复制代码

注意,不需要在你的Lua脚本中显式的全局变量,如果全局变量不存在,lua_setglobal()将创建一个新的全局变量。

论坛徽章:
0
2 [报告]
发表于 2005-04-17 00:02 |只看该作者

C/C++中嵌入Lua--转自bbs.luachina.net

竟然没有知音,悲哀

论坛徽章:
0
3 [报告]
发表于 2005-10-07 10:20 |只看该作者

C/C++中嵌入Lua--转自bbs.luachina.net

我不懂LUA
网上有评论说LUA的代码写的很好
载了一个看看果然不错
是学习Makefile和ASCII C的好教材
不过它支持的库太少啦
要是python也能这样嵌入C语言就好了
呵呵

论坛徽章:
0
4 [报告]
发表于 2005-10-07 10:41 |只看该作者

C/C++中嵌入Lua--转自bbs.luachina.net

不好意思纠正一下
python是可以被嵌入到c里头的
抄袭一个网上的例子

  1. #include <python2.4/Python.h>;
  2. int
  3. main(int argc, char *argv[])
  4. {
  5.         Py_Initialize();
  6.         PyRun_SimpleString("from time import time,ctime\n"
  7.                            "print 'Today is',ctime(time())\n");
  8.         Py_Finalize();
  9.         return 0;
  10. }
复制代码

cc python_embed.c -lpython2.4
./a.out
Today is Fri Oct  7 10:41:37 2005

论坛徽章:
0
5 [报告]
发表于 2005-10-07 10:45 |只看该作者

C/C++中嵌入Lua--转自bbs.luachina.net

我也在看<programming in Lua>;

论坛徽章:
0
6 [报告]
发表于 2005-10-07 15:08 |只看该作者

C/C++中嵌入Lua--转自bbs.luachina.net

lua 还是很不错的,至少现在我已经把它真正用到了客户的项目中,而且用起来也很爽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP