2013-05-07 29 views
1

Lightuserdata與userdata不同,所以我能用它做什麼?我的意思是lua中的lightuserdata的操作。看起來我無法將其轉換爲任何其他數據類型。是否有內置的例程將lightuserdata轉換爲int?

我的一個案例:

我的C庫返回名爲 'c_pointer',又名lightuserdata到Lua C指針,然後我想:

my_pointer = c_pointer +4

,然後將'my_pointer'傳回C庫。由於我無法對'c_pointer'進行任何操作,因此表達式'c_pointer + 4'無效。

我想知道是否有一些實際的解決方案呢?

+1

不,沒有。你在期待什麼? – finnw 2013-05-07 00:54:42

+0

@finnw是的我正在返回一個指向lua的C指針,我想根據它做一些事情,比如:my_pointer = c_pointer + 4,然後將my_pointer傳回到c庫 – 2013-05-07 01:45:32

回答

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]; 
+0

你的意思是'Lua代碼可以使用lightuserdata作爲任何其他價值'?不需要先轉換它嗎?我用lightuserdata嘗試了'nonumber',但失敗 – 2013-05-07 02:09:49

+0

我的意思是它可以作爲函數的參數傳遞,作爲函數的結果返回,作爲鍵或值存儲在表中,並被分配到變量(本地或全局)。它不能轉換爲任何其他類型,儘管它可以被打印。 – 2013-05-07 03:00:07

+0

感謝您的回答 – 2013-05-07 03:44:15

0

Plain Lua沒有指針運算,所以Doug Currie指出你需要在C端做指針運算。

LuaJIT另一方面可以做指針算術(通過FFI庫),所以請考慮使用它來代替。