是否有内置例程将lightuserdata转换为int?

时间:2013-05-07 00:32:08

标签: lua

Lightuserdata与userdata不同,那么我该怎么办呢?我的意思是lua中lightuserdata的操作。看起来我无法将其转换为任何其他数据类型。

我的一个案例:

我的C库返回一个名为'c_pointer'的C指针,AKA lightuserdata到Lua,然后我想:

my_pointer = c_pointer +4

然后将'my_pointer'传递回C库。由于我无法对'c_pointer'执行任何操作,因此表达式'c_pointer + 4'无效。

我想知道有一些实用的解决方案吗?

2 个答案:

答案 0 :(得分:2)

Lightuserdata由C库创建。它们只是C指针。

例如,您可以使用它们来引用您使用malloc分配的数据,或者在模块中静态分配。您的C库可以使用lua_pushlightuserdata将这些指针作为lightuserdata传输到Lua端,然后Lua可以将它返回到堆栈上的库(或其他C代码)。 Lua代码可以将lightuserdata用作任何其他值,例如,甚至作为表键存储在表中。

附录

要回答修改后的问题,如果要为指针添加偏移量,请在C侧执行此操作。将lightuserdata和整数偏移量传递给C,然后让C使用ptr[n]

进行偏移
void * ptr = lua_touserdata(L, idx1);
lua_Integer n = lua_tointeger(L. idx2);
// do something with
((char *)ptr)[n];

答案 1 :(得分:0)

Plain Lua没有指针算术,因此Doug Currie表示你需要在C端进行指针运算。

另一方面,

LuaJIT可以进行指针运算(通过FFI库),所以请考虑使用它。