2012-05-12 20 views
0

私はセットアップにスクリプト作成のためのLuaの関数のカップルをしたいが、それらの関数が呼び出されたときに、私は彼らが実際に私が定義するパラメータで、単一の機能を呼び出すようにしたいと思います。Luaのコールバックが

のLua:

foo1() 
    foo2() 

C++:

int myFunction(lua_State * context) 
{ 
    int numArgs = lua_gettop(context); 
    int topOfStack = -3; 
    bool lightUserDataFlag = lua_islightuserdata(context, topOfStack); 

    if(lightUserDataFlag) 
    { 
    } 
} 

}

だから私はセットアップに少し混乱していますこれは、次のようになります。コールバックをparamで登録しようとしています。これは私がこれまで持っていたものであり、関数登録でparamを保存していないものがあります。最後に追加したパラメータのみを保存するように見えます。

void setupCallback() 
{ 
    lua_register(context, "foo1", Callback); 
    lua_pushlightuserdata(context, &value[0]); 
    lua_register(context, "foo2", Callback); 
    lua_pushlightuserdata(context, &value[1]); 
} 

ルアが自分のコールバックを呼び出すとき、私は常に値[1]を参照し、値[0]は表示しません。私はコールバックを登録してテーブルを追加するという考え方で遊んでいましたが、これで私にはそれ以上のことは分かりません。

理由として:私は簡単に私たちのLUAプログラマのための書き込みコードを作るために、抽象関数名にしようとしていますが、それらは単に同じパラメータ化関数に変換する必要があります。単一のパラメータを渡すことによって設定を変更することを追加すると思いますが、別の名前を付けます。

思考?

答えて

4

あなたはおそらく、あなたの関数の上位値として、これらのコンテキスト値を添付したいです。 lua_pushcclosure()をご覧ください。私がまさに必要だ

int Callback (lua_State *context) 
{ 
    int val= lua_tointeger(context, lua_upvalueindex(1)); 
    cout << val << endl; 
    ... 
} 

void setup() 
{ 
    lua_pushnumber(context, 3); 
    lua_pushcclosure(context, Callback, 1); 
    lua_setglobal(context, "foo1"); 

    lua_pushnumber(context, 42); 
    lua_pushcclosure(context, Callback, 1); 
    lua_setglobal(context, "foo2"); 
} 
+0

:ミッキーKawickさんのコメントを取り入れ

。私はこれで終わりました。 INT \tコールバック(lua_State *コンテキスト) {int型のval = lua_tointeger(コンテキスト、lua_upvalueindex(1))。 cout << val << endl; ...空隙セットアップ(){ lua_pushnumber(文脈、3)。 lua_pushcclosure(コンテキスト、コールバック、1); lua_setglobal(context、 "foo1"); lua_pushnumber(context、42); lua_pushcclosure(コンテキスト、コールバック、1); lua_setglobal(context、 "foo2"); –

+0

@MickeyKawick:チェックボックスをクリックすることで、あなたのニーズを満たす答えを受け入れる必要があります。 – Managu