Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232151
  • 博文数量: 56
  • 博客积分: 2480
  • 博客等级: 大尉
  • 技术积分: 475
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-28 10:57
文章分类

全部博文(56)

文章存档

2012年(36)

2011年(4)

2010年(2)

2009年(14)

我的朋友

分类: Python/Ruby

2012-03-08 09:55:47

table, 作为Lua中的重要类型, 为数据管理提供了许多便利. 我们可以用C++, 在Lua上下文(Lua_State)中注册table, 以便lua程序可以方便的和C++进行交互.

先来看一段C++代码:

 

1
2
3
4
5
6
7
lua_State* pLuaState = luaL_newstate();
luaL_openlibs(pLuaState);
 
lua_createtable(pLuaState, 0, 1);
lua_pushcclosure(pLuaState, CallBack, 0);
lua_setfield(pLuaState, -2, "Add");
lua_setfield(pLuaState, LUA_GLOBALSINDEX, "Math");

 

这里, 我创建了一个Lua table(lua_createtable), 并将C++函数CallBack以"Add"为键值, 注册到新的table中, 然后将table作为全局变量Math注册到当前的上下文中.

这样, 我在lua代码中就可以这样写:

这条语句, 通过执行Math表中的Add, 从而调用到C++中的CallBack函数.

当我们不再需要这个table的时候, 我们使用以下的语句, 将table的引用减少.

 

1
2
lua_pushnil(pLuaState);
lua_setfield(pLuaState, LUA_GLOBALSINDEX, "Math");

 

这两条语句相当于lua中的 Math = nil, 这样, GC就可以回收table和function的资源了.

下面附上完整的C++代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include
 
#pragma comment(lib, "lua51.lib")
 
int CallBack(lua_State* pLuaState)
{
    int a = luaL_checkint(pLuaState, 1);
    int b = luaL_checkint(pLuaState, 2);
 
    lua_pushnumber(pLuaState, a + b);
 
    return 1;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    lua_State* pLuaState = luaL_newstate();
    luaL_openlibs(pLuaState);
 
    lua_createtable(pLuaState, 0, 1);
    lua_pushcclosure(pLuaState, CallBack, 0);
    lua_setfield(pLuaState, -2, "Add");
    lua_setfield(pLuaState, LUA_GLOBALSINDEX, "Math");
 
    if (luaL_loadfile(pLuaState, "test.lua") ||
        lua_pcall(pLuaState, 0, 0, 0))
    {
        printf("%s\n", lua_tostring(pLuaState, -1));
        lua_pop(pLuaState, 1);
        lua_close(pLuaState);
        return 0;
    }
 
    lua_pushnil(pLuaState);
    lua_setfield(pLuaState, LUA_GLOBALSINDEX, "Math");
 
    if (luaL_dostring(pLuaState, "print(Math.Add(100, 10))"))
    {
        printf("%s\n", lua_tostring(pLuaState, -1));
        lua_pop(pLuaState, 1);
        lua_close(pLuaState);       // 这里加断点调试, 查看控制台输出结果
        return 0;
    }
 
    lua_close(pLuaState);
    return 0;
}
阅读(1229) | 评论(0) | 转发(0) |
0

上一篇:lua和C++相互交换数据

下一篇:lua c++ 2

给主人留下些什么吧!~~