6

長さ不明のテーブルを Lua からバインドされた C++ 関数に渡すにはどうすればよいですか?

次のようにLua関数を呼び出せるようにしたい:

call_C_Func({1,1,2,3,5,8,13,21})

テーブルの内容を配列 (できれば STL ベクトル) にコピーしますか?

4

3 に答える 3

3

これは私の試みです(エラーチェックなし):

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;
}
于 2010-02-12T15:15:49.590 に答える
3

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
}
于 2010-02-08T05:33:26.923 に答える
-1

lua_objlen も使用できます。

指定された受け入れ可能なインデックスの値の「長さ」を返します。文字列の場合、これは文字列の長さです。テーブルの場合、これは長さ演算子 ('#') の結果です。ユーザーデータの場合、これはユーザーデータに割り当てられたメモリのブロックのサイズです。他の値の場合は 0 です。

于 2010-02-08T15:10:46.010 に答える