我正在用lua擴展一個接口,並且遇到了問題,因爲我需要將指向對象的指針傳遞給lua代碼才能工作。這些類將通過SWIG包裝,我可以通過使用swig的lua實例化它們,但這會讓我留下無用的對象。將非全局C++對象傳遞給Lua函數(Swig)
我需要能夠將回調對象傳遞給lua以及表示事件的對象。我無法手動將回調定義爲全局的,因爲這會引入一個不可接受的約束。
因此,對於一個通用的例子,給定一個類C和lua中的函數需要1個參數,我怎樣在傳遞C類型的C++指針時調用lua函數?
我正在用lua擴展一個接口,並且遇到了問題,因爲我需要將指向對象的指針傳遞給lua代碼才能工作。這些類將通過SWIG包裝,我可以通過使用swig的lua實例化它們,但這會讓我留下無用的對象。將非全局C++對象傳遞給Lua函數(Swig)
我需要能夠將回調對象傳遞給lua以及表示事件的對象。我無法手動將回調定義爲全局的,因爲這會引入一個不可接受的約束。
因此,對於一個通用的例子,給定一個類C和lua中的函數需要1個參數,我怎樣在傳遞C類型的C++指針時調用lua函數?
啊哈,回答我的問題,但我創立了!
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()
讓我知道如果您有任何其他 問題。問候,馬克
我還沒有使用Swig與C++和Lua,但是你可以在兩種不同的方式(userdata和closures)下不用Swig來完成。我不知道Swig是否干涉了這件事。