【Lua】組み込み系言語総合 その2【Squirrel】
at TECH
476:デフォルトの名無しさん
09/11/22 12:35:08
>>475
そういう用途のためにレジストリとリファレンスの機構が存在する。
1. 任意のオブジェクト(この場合はテーブル)を作る
2. int table = luaL_ref(state, LUA_REGISTRYINDEX); でレジストリに該当テーブルを格納してリファレンスを取得。
オブジェクトはスタックからは解放されて、レジストリテーブルでのみ保持された状態になる。
リファレンス値は全体でユニークで、C 側でそのままオブジェクトを区別しつつ単純保持するのに使える
3. 使いたい場面(この場合は引数として渡す時)では、
lua_rawgeti(state, LUA_REGISTRYINDEX, table) としてレジストリからスタックに取り出してきて使う
4. 最後破棄する場合は luaL_unref(state, LUA_REGISRYINDEX, table) として解放させる
N個つくるならこんなかんじで
// テーブル確保
int table[N];
for (int i=0;i<N;i++) {
lua_newtable(state);
table[i] = luaL_ref(state, LUA_REGISTRYINDEX);
}
// 例えば table[0] をわたして関数を呼ぶ
lua_getfield(state, LUA_GLOBALSINDEX, "func"); // 関数取得
lua_rawgeti(state, LUA_REGISTRYINDEX, table[0]); // 引数としてつむ
lua_call(state, 1, 0); // 引数1戻り値無し
// テーブル解放
for (int i=0;i<N;i++) {
luaL_unref(state, LUA_REGISTRYINDEX, table[i]);
}
ちなみに squirrel だとオブジェクトのリファレンスを、直接C側から HSQOBJECT としてスタックから取得して
保持できる。概念としてはこっちのがシンプル。
次ページ続きを表示1を表示最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4274日前に更新/247 KB
担当:undef