長さ不明のテーブルを Lua からバインドされた C++ 関数に渡すにはどうすればよいですか?
次のようにLua関数を呼び出せるようにしたい:
call_C_Func({1,1,2,3,5,8,13,21})
テーブルの内容を配列 (できれば STL ベクトル) にコピーしますか?
これは私の試みです(エラーチェックなし):
int lua_test( lua_State *L ) {
std::vector< int > v;
const int len = lua_objlen( L, -1 );
for ( int i = 1; i <= len; ++i ) {
lua_pushinteger( L, i );
lua_gettable( L, -2 );
v.push_back( lua_tointeger( L, -1 ) );
lua_pop( L, 1 );
}
for ( int i = 0; i < len; ++i ) {
std::cout << v[ i ] << std::endl;
}
return 0;
}
LuaBindを使用する場合は、登録された 1 つの呼び出しと同じくらい簡単です。独自のロールアップについては、 lua_next関数を確認する必要があります。
基本的にコードは次のとおりです。
lua_pushnil(state); // first key
index = lua_gettop(state);
while ( lua_next(state,index) ) { // traverse keys
something = lua_tosomething(state,-1); // tonumber for example
results.push_back(something);
lua_pop(state,1); // stack restore
}
lua_objlen も使用できます。
指定された受け入れ可能なインデックスの値の「長さ」を返します。文字列の場合、これは文字列の長さです。テーブルの場合、これは長さ演算子 ('#') の結果です。ユーザーデータの場合、これはユーザーデータに割り当てられたメモリのブロックのサイズです。他の値の場合は 0 です。