我正在使用Lua/C绑定,并且存储在lua表中的对象是轻型用户数据,我遇到了一个问题。在下面的示例中,我使用一些数据从C调用'myfunction‘,然后使用我的函数"net.connection(v)“分配一个新对象(在C中),该函数使用lua_newuserdata()返回对象结果。我尝试使用这个值作为表'mytable‘的关键字。当我调用'myfunction',创建我的新对象,并将其存储在我的表中时,它看起来很好,因为我存储到表中的值就是'print‘给我的。
mytable = {}
function action(obj)
print(mytable[obj])
end
function myfunction(data)
for k,v in pairs(data) do
theObj = net.connection(v)
mytable[theObj] = "test string"
print(mytable[theObj]) --Prints 'test string'
end
end但是,在以后的某个时间点,我想使用相同的对象指针(上面的函数'action‘)来查找此数据,但总是得到nil。(theObj和obj)的指针地址是相同的,当我打印表的内容(键、值)时,表似乎同时包含指向我的用户数据的指针和正确的值,但是当我使用参数(obj)时,我无法从表中检索值。在函数'action‘的情况下,我使用push_lightuserdata将用户数据推送到堆栈上。
以这种方式使用push_lightuserdata是否有任何可能导致此问题的微妙之处?
根据this link,使用轻型用户数据作为表键是可以的…
发布于 2011-12-31 11:21:33
在Lua中,Userdata和light userdata是两种截然不同的类型。您正在将一个userdata作为键放在表中,然后尝试使用一个轻量级的userdata来查找它。那行不通的。您需要使用相同的类型。
由于您要将net.connection创建为用户数据,因此需要将其保存在某个表中,以便以后可以在C中找到它。
https://stackoverflow.com/questions/8683144
复制相似问题