如何将c结构数据传给lua(转)
2016-04-12 17:46
525 查看
最近需要使用lua来让策划那些配置一些逻辑,于是调研了一下lua是如何实现这部分工作的,
最终发现一个通常的策划是利用lightuserdata和metatable来协调解决这个问题。也即将数据
指针给lua,另外告诉它一个如何操作这些数据的metamethods即可。
请看下面的示例代码:
[cpp] view plaincopy
typedef struct
{
int x;
int y;
int z;
}TData;
static int getAttribute(lua_State* L)
{
TData *data = (TData*)lua_touserdata(L, 1);
std::string attribute = luaL_checkstring(L, 2);
int result = 0;
if(attribute == "x")
{
result = data->x;
}
else if(attribute == "y")
{
result = data->y;
}
else
{
result = data->z;
}
lua_pushnumber(L, result);
return 1;
}
static struct luaL_reg dataLib[] = {
{"__index", getAttribute},
{NULL, NULL}
};
void getMetaTable(lua_State* L, luaL_reg* methods)
{
lua_pushlightuserdata(L, methods);
lua_gettable(L, LUA_REGISTRYINDEX);
if (lua_isnil(L, -1)) {
/* not found */
lua_pop(L, 1);
lua_newtable(L);
luaL_register(L, NULL, methods);
lua_pushlightuserdata(L, methods);
lua_pushvalue(L, -2);
lua_settable(L, LUA_REGISTRYINDEX);
}
}
int main()
{
const char* filename = "test.lua";
lua_State *lua = lua_open();
if (lua == NULL)
{
fprintf(stderr, "open lua failed");
return -1;
}
luaL_openlibs(lua);
TData input = {1, 2, 3};
lua_pushlightuserdata(lua, &input);
getMetaTable(lua, dataLib);
lua_setmetatable(lua, -2);
lua_setglobal(lua, "input");
if (luaL_dofile(lua, filename))
{
luaError(lua, "load file %s failed", filename);
}
lua_getglobal(lua, "data");
int output = lua_tointeger(lua, 0);
std::cout << output << std::endl;
return 0;
}
最终发现一个通常的策划是利用lightuserdata和metatable来协调解决这个问题。也即将数据
指针给lua,另外告诉它一个如何操作这些数据的metamethods即可。
请看下面的示例代码:
[cpp] view plaincopy
typedef struct
{
int x;
int y;
int z;
}TData;
static int getAttribute(lua_State* L)
{
TData *data = (TData*)lua_touserdata(L, 1);
std::string attribute = luaL_checkstring(L, 2);
int result = 0;
if(attribute == "x")
{
result = data->x;
}
else if(attribute == "y")
{
result = data->y;
}
else
{
result = data->z;
}
lua_pushnumber(L, result);
return 1;
}
static struct luaL_reg dataLib[] = {
{"__index", getAttribute},
{NULL, NULL}
};
void getMetaTable(lua_State* L, luaL_reg* methods)
{
lua_pushlightuserdata(L, methods);
lua_gettable(L, LUA_REGISTRYINDEX);
if (lua_isnil(L, -1)) {
/* not found */
lua_pop(L, 1);
lua_newtable(L);
luaL_register(L, NULL, methods);
lua_pushlightuserdata(L, methods);
lua_pushvalue(L, -2);
lua_settable(L, LUA_REGISTRYINDEX);
}
}
int main()
{
const char* filename = "test.lua";
lua_State *lua = lua_open();
if (lua == NULL)
{
fprintf(stderr, "open lua failed");
return -1;
}
luaL_openlibs(lua);
TData input = {1, 2, 3};
lua_pushlightuserdata(lua, &input);
getMetaTable(lua, dataLib);
lua_setmetatable(lua, -2);
lua_setglobal(lua, "input");
if (luaL_dofile(lua, filename))
{
luaError(lua, "load file %s failed", filename);
}
lua_getglobal(lua, "data");
int output = lua_tointeger(lua, 0);
std::cout << output << std::endl;
return 0;
}
相关文章推荐
- Lua注册回调到C++
- Lua中的userdata
- lua-5.1 和 lua-5.2 之间的一些差异
- lua 和 C 语言进行交互 —— 如何传递table
- C++和Lua相互传递数据
- Lua的栈及基本栈操作
- 【笨木头Lua专栏】基础补充05:迭代器番外篇
- Lua 控制台输出
- 从lua调用C函数
- 编写高性能的Lua代码
- Lua动态list
- Lua语法
- [lua]lua简介
- Lua的模块编写与module函数
- Lua _G
- Lua error
- 【Lua游戏开发】os库-时间函数 转
- 项目记录35--tolua 框架 场景管理SceneManager
- C++混合编程之idlcpp教程Lua篇(6)
- lua类实现