4

私はC++オブジェクトを持っており、Luaオブジェクト/テーブルを持っています。(SWIG C ++バインディングもあります。)

私ができる必要があるのは、2つのオブジェクトを関連付けて、

CObject* o1 = getObject();
o1->Update();

それは同等のLuaを実行します:

myluatable1.Update();

これまでのところ、CObject::Updateには次のコードがあると想像できます。

void CObject::Update(){
    // Acquire table.

    // ???

    // Do the following operations on the table.
    lua_getfield(L, -1, "Update");
    lua_pcall(L, 0, 0, 0);
}

使用するLuaテーブルをどのように保存/設定し // ???ますか?また、Update呼び出しを機能させるために上記で何をしますか?

4

2 に答える 2

17

誰もこれに気づかなかったなんて信じられない!

http://www.lua.org/pil/27.3.2.html

luaオブジェクトとテーブルへの参照を格納し、C構造体に格納する目的で参照を返すためのLuaAPIのセクション!!

于 2010-01-13T15:11:09.203 に答える
2

この「リバースSWIG」の理由に興味があります...

LuaのオブジェクトはLuaコンテキスト内に存在するため、少なくともオブジェクト内に「L」を格納する必要があります。

「テーブルポインタ」を渡す問題はもう少し微妙です。LuaではLuaスタックからポインタを取得できますが(lua_topointer()を使用)、それを元に戻す方法はありません。当然のことながら、そうでない場合は、ポインタが有効なオブジェクトなどを指していることも確認する必要があるためです。

ただし、テーブルへの参照をグローバルテーブルに格納することもできます。インデックスは、オブジェクトへのポインタであるlightuserdataです。次に、Luaの状態とグローバル配列の名前を設定することで、テーブルへの参照を取得し、そのコンテキストのLuaスタックにプッシュできます。

これは大雑把であり、この構成でのガベージコレクションの問題には触れていません。

しかし、いずれにせよ、これはパフォーマンス面ではスピードレーサーにはならず、私には多くの定型C++コードのように見えます。私はアプローチを再考し、あなたがやりたいことのいくつかをLuaドメインにプッシュしようと思います。

psは、前の2つの質問とほぼ同じように見える3番目の質問のように見えます。ここと、ここに前の質問があります。それらが完全に答えられなかった場合、それらを編集するか、答えを蓄積するために報奨金を追加する方がよいでしょう。

于 2009-12-29T13:30:55.807 に答える