Domanda

Come faccio a passare un tavolo di lunghezza sconosciuta da Lua in una funzione legata C ++?

Voglio essere in grado di chiamare la funzione Lua in questo modo:

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

E copiare il contenuto della tabella in un array (preferibilmente vettore STL)?

È stato utile?

Soluzione

Se si utilizza LuaBind è semplice come una chiamata registrata. Per quanto riguarda il rotolamento il proprio, è necessario dare un'occhiata a lua_next funzione.

In pratica il codice è il seguente:

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
}

Altri suggerimenti

Questo sarebbe il mio tentativo (senza controllo degli errori):

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;
}

È inoltre possibile utilizzare lua_objlen:

  

Restituisce la "lunghezza" della   value alla data dell'indice accettabile:   per archi, questa è la stringa   lunghezza; per le tabelle, questo è il risultato   dell'operatore lunghezza ( '#'); per   userdata, questa è la dimensione della   blocco di memoria allocata per la   dati utente; per altri valori, è 0.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top