1

lua を使用してインターフェイスを拡張していますが、オブジェクトへのポインターを lua コードに渡して作業する必要があるという問題に遭遇しました。これらのクラスは SWIG を介してラップされ、swig を使用して lua を介してそれらをインスタンス化できますが、それでは役に立たないオブジェクトが残ります。

イベントに関するものを表すオブジェクトだけでなく、コールバック オブジェクトを lua に渡すことができる必要があります。コールバックをグローバルとして手動で定義することはできません。受け入れられない制約が導入されるためです。

一般的な例として、クラス C と 1 つのパラメーターを受け取る lua の関数がある場合、C 型の C++ ポインターを渡しながらその lua 関数を呼び出すにはどうすればよいでしょうか?

4

2 に答える 2

4

ああ、私自身の質問に答えていますが、私はそれを見つけました!

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

こんにちはジョーイ、

私はほとんどすべての SWIG-LUA 作業を lua 側から行います。Swig は、C/C++ ライブラリをラップして lua で読み取れるようにするのに非常に適しています。C++ を lua と対話させるのはかなり簡単ですが、十分に文書化されていません。

)のアイデアlua_pushlightuserdata(は近かったが、そこにはありませんでした。おそらく次のようなものが必要です。

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

SWIG_NewPointerObj() は、foo オブジェクトのユーザーデータ (lightuserdata ではない) を作成し、それをスタックにプッシュします。最後のパラメータ (この場合は 1) は、lua でメモリを管理するかどうかです (いいえの場合は 0、はいの場合は 1)。

SWIG_NewPointerObj()と はSWIGTYPE_p_Foo両方ともラッピング ファイルにあります。

それができたら、luaでできるはずです:

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

他にご不明な点がございましたら、お問い合わせください。よろしく、マーク

于 2010-03-07T11:24:36.173 に答える
0

私は C++ と Lua で Swig を使用したことはありませんが、2 つの異なる方法 (ユーザーデータとクロージャー) で Swig なしで使用できます。Swig が何らかの形でこれに干渉するかどうかはわかりません。

ユーザーデータの使用

lua_pushcclosure

于 2010-03-07T08:40:02.897 に答える