如何将c结构数据传给lua

来源:互联网 发布:阿里云ecs无法连接ftp 编辑:程序博客网 时间:2024/05/22 04:58

http://blog.csdn.net/hopingwhite/article/details/6681826


最近需要使用lua来让策划那些配置一些逻辑,于是调研了一下lua是如何实现这部分工作的,

最终发现一个通常的策划是利用lightuserdata和metatable来协调解决这个问题。也即将数据

指针给lua,另外告诉它一个如何操作这些数据的metamethods即可。

 

请看下面的示例代码:

[cpp] view plain copy
  1. typedef struct  
  2. {  
  3.     int x;  
  4.     int y;  
  5.     int z;  
  6. }TData;  
  7.   
  8. static int getAttribute(lua_State* L)  
  9. {  
  10.     TData *data = (TData*)lua_touserdata(L, 1);   
  11.     std::string attribute = luaL_checkstring(L, 2);   
  12.     int result = 0;  
  13.     if(attribute == "x")  
  14.     {     
  15.         result = data->x;  
  16.     }     
  17.     else if(attribute == "y")  
  18.     {     
  19.         result = data->y;  
  20.     }     
  21.     else  
  22.     {     
  23.         result = data->z;  
  24.     }  
  25.     lua_pushnumber(L, result);  
  26.     return 1;  
  27. }  
  28.   
  29. static struct luaL_reg dataLib[] = {  
  30.     {"__index", getAttribute},  
  31.     {NULL, NULL}  
  32. };  
  33.   
  34. void getMetaTable(lua_State* L, luaL_reg* methods)  
  35. {  
  36.     lua_pushlightuserdata(L, methods);  
  37.     lua_gettable(L, LUA_REGISTRYINDEX);  
  38.     if (lua_isnil(L, -1)) {  
  39.         /* not found */  
  40.         lua_pop(L, 1);  
  41.   
  42.         lua_newtable(L);  
  43.         luaL_register(L, NULL, methods);  
  44.   
  45.         lua_pushlightuserdata(L, methods);  
  46.         lua_pushvalue(L, -2);  
  47.         lua_settable(L, LUA_REGISTRYINDEX);  
  48.     }  
  49. }  
  50.   
  51. int main()  
  52. {  
  53.     const char* filename = "test.lua";  
  54.     lua_State *lua = lua_open();  
  55.     if (lua == NULL)  
  56.     {  
  57.         fprintf(stderr, "open lua failed");  
  58.         return -1;  
  59.     }  
  60.     luaL_openlibs(lua);  
  61.   
  62.     TData input = {1, 2, 3};  
  63.     lua_pushlightuserdata(lua, &input);  
  64.     getMetaTable(lua, dataLib);  
  65.     lua_setmetatable(lua, -2);  
  66.     lua_setglobal(lua, "input");  
  67.     if (luaL_dofile(lua, filename))  
  68.     {  
  69.         luaError(lua, "load file %s failed", filename);  
  70.     }  
  71.     lua_getglobal(lua, "data");  
  72.     int output = lua_tointeger(lua, 0);  
  73.     std::cout << output << std::endl;  
  74.     return 0;  
  75. }  

0 0
原创粉丝点击