2011-06-10 66 views
2

我可能會誤解他們的使用或誤讀文檔,但是如何訪問作爲light userdata傳遞給Lua的結構或類的成員?例如,如果使用載體下面的結構在Lua中訪問Light userdata

typedef struct Foo { 
    int x; 
    int y; 
} Foo; 

被宣佈爲「測試」並定義爲像X = 413和y = 612,以及與呼叫推

lua_pushlightuserdata(L, (void *) &test) ; 

會是什麼操縱或打印x和y的函數的Lua代碼看起來像?

+3

如果您想要操作Lua端的對象,最好使用userdata而不是light userdata。我在這裏用C++寫了一個很長的答案:http://stackoverflow.com/questions/3481856/sending-variable-pointers-back-and-forth-between-c-and-lua/3506654#3506654另外你可以使用lua綁定。 – 2011-06-10 16:48:26

回答

11

Lua中的light userdata只是一個指針。 Lua不理解如何讀取指針引用的對象的內容。此數據的目的是允許一個C API調用將引用傳遞給另一個API調用。

如果你想在Lua中使用數據,你需要把它推到堆棧上,在你的情況下,我會把它做成一張桌子。如果你需要在C和Lua之間同步這個數據,那麼你需要編寫雙方的函數來處理賦值並將值複製到其他環境中。另一種選擇是僅在Lua中獲取數據,並在C語言中通過Lua API檢索數據,或者使用C語言獲取數據,並在Lua中通過C API(您將創建)檢索它。

欲瞭解更多信息,Programming in LuaLua-users Wiki各有簡要說明。

2

沒什麼。你不能訪問或做任何與Lua的任何類型的用戶數據。您必須爲所有操作提供C++函數。當然,通過正確使用元函數可以使這更容易。

哦,你不需要C++中的那個typedef struct垃圾。你可以說

struct Foo { 
    int x; 
    int y; 
}; 
+0

但是如何讀取數據,如「如果x> 5,那麼y = -x?」數據交互的所有實例是否都需要自己的C++函數來更改或返回數據? – Lucas 2011-06-10 15:51:31