2011-12-30 58 views
1

我正在使用Lua/C綁定,並且存儲在輕量用戶數據的lua表中的對象存在問題。在下面的例子中,我從C調用'myfunction',其中一些數據用於通過我的函數「net.connection(v)」分配一個新對象(使用C語言),它使用 lua_newuserdata()返回對象結果。我嘗試將這個值用作表'mytable'中的一個鍵。當我調用'myfunction'時,創建我的新對象並將其存儲在我的表中,因爲我存儲到表中的值是'print'給我的值。Light userdata as table keys

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 

然而,在稍後的時間點,我想用同一個對象的指針(函數「動作」以上)查找此數據,但總是爲零。 (theObj和obj)的指針地址是相同的,當我打印出表格的內容(鍵,值)時,表格中同時包含一個指向我的用戶數據的指針和正確的值,但是當我使用參數(obj),我無法從表中檢索值。在函數'action'的情況下,我使用push_lightuserdata將用戶數據推送到堆棧上。

以這種方式使用push_lightuserdata可能會導致此問題有什麼細微之處嗎?

Accoring到this鏈路,利用光用戶數據作爲表密鑰是細...

+0

發現它只是爲了澄清,當你做這樣的事'爲K, v成對(mytable)做print(k,v)end',你可以看到你想要的鍵值對,但是當你用看起來合適的鍵調用'action'時,你會得到零?或者你是否試圖從未在此發佈的C代碼中獲取'mytable'中的值? – Alex 2011-12-30 19:26:02

+0

你是對的。在'action'中迭代表格時,我可以看到我想要的鍵值對,但是當我嘗試使用參數作爲鍵獲取值時,它給了我一個零結果。 – jimt 2011-12-30 19:29:45

+2

您是否嘗試過直接在'action'內使用'print(obj)'檢查密鑰以確保它獲得您期望的值?如果表中沒有很多其他鍵值對,我可以嘗試添加如下內容:'對於k,v成對(mytable)如果k == obj則執行print(k,v,「找到它! )else print(k,v)end'。使用輕量級用戶數據作爲密鑰應該沒問題,所以在這裏必須有一個愚蠢的錯誤。 : -/ – Alex 2011-12-30 19:39:33

回答

4

使用用戶數據和用戶數據的光是兩種不同類型的在Lua。您將表中的用戶數據作爲關鍵字,然後嘗試用輕量用戶數據找到它。這是行不通的。你需要使用相同的類型。

既然你正在創建的net.connection作爲用戶數據,你需要保持在一個表中的某個地方,所以你以後可以從C

+0

這有很大幫助。不過,我仍然對如何解決這個問題感到困惑。我如何去重新實現上面的例子來使它工作?如果userdata和light userdata是不同的類型,我怎樣才能調用除了輕量級userdata之外的任何回調?那可能嗎? – jimt 2011-12-31 19:50:30

+0

有幾種方法可以保留用戶數據指針,以便可以從C代碼訪問它們。一種方法是將它們放在由整數或輕型用戶數據索引的註冊表中。一種更安全的方法(避免註冊表膨脹和關鍵衝突)是將它們存儲在C庫的一個函數(或所有函數,如果它們共享閉包)的高價值中。請參閱:http://www.lua.org/pil/27.3.3.html – 2012-01-02 16:19:11