2010-03-07 91 views
1

我正在用lua擴展一個接口,並且遇到了問題,因爲我需要將指向對象的指針傳遞給lua代碼才能工作。這些類將通過SWIG包裝,我可以通過使用swig的lua實例化它們,但這會讓我留下無用的對象。將非全局C++對象傳遞給Lua函數(Swig)

我需要能夠將回調對象傳遞給lua以及表示事件的對象。我無法手動將回調定義爲全局的,因爲這會引入一個不可接受的約束。

因此,對於一個通用的例子,給定一個類C和lua中的函數需要1個參數,我怎樣在傳遞C類型的C++指針時調用lua函數?

回答

3

啊哈,回答我的問題,但我創立了!

http://lua-users.org/lists/lua-l/2007-05/msg00053.html

你好喬伊,

我幾乎所有的夜風,LUA從 的LUA邊工作。 Swig對於 非常有用,只是將一個C/C++庫包裝到 ,讓它可以被lua讀取。讓C++與lua交談是相當容易的,但 沒有很好的記錄。

你的想法lua_pushlightuserdata(), 已接近,但沒有。你可能 想是這樣的:對於 Foo對象&它推到堆棧

Foo* p= new Foo(); 
SWIG_NewPointerObj(L,p,SWIGTYPE_p_Foo,1); 
lua_setglobal (L, "p"); 

的SWIG_NewPointerObj()創建一個 用戶數據(而不是lightuserdata)。 最後一個參數(在本例中爲1)是 ,無論您是想讓lua管理內存(0代表否,1代表是)。

SWIG_NewPointerObj()SWIGTYPE_p_Foo都在 包裝文件中找到。

一旦你有,你應該能夠 在Lua做:

print(p) 
print(swig_type(p)) 
p:some_function() 

讓我知道如果您有任何其他 問題。問候,馬克

0

我還沒有使用Swig與C++和Lua,但是你可以在兩種不同的方式(userdata和closures)下不用Swig來完成。我不知道Swig是否干涉了這件事。

Using Userdata

lua_pushcclosure