2010-02-08 11 views
5

Wie würde ich eine Tabelle unbekannter Länge von Lua in eine gebundene C++ - Funktion übergeben?Wie übergebe ich eine Tabelle von Lua an C++?

Ich möchte die Lua Funktion wie diese in der Lage sein zu nennen:

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

und kopieren Sie den Inhalt der Tabelle in ein Array (vorzugsweise STL Vektor)?

+0

Verwenden Sie nur den rohen Lua c-api? Oder benutzen Sie eine der vielen Bibliotheken ToLua, lua ++, luabind? Die Details der Antwort hängen von Ihrem Ansatz ab. –

Antwort

3

Wenn Sie LuaBind verwenden, ist es so einfach wie ein registrierter Anruf. Wie für eigene aufrollen, müssen Sie einen Blick auf lua_next Funktion.

Grundsätzlich wird der Code wie folgt:

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 
} 
+2

Ist die Verwendung von lua_next() korrekt? Für die next() - Funktion gibt das Lua-Handbuch an: "Die Reihenfolge, in der die Indizes aufgelistet werden, ist selbst für numerische Indizes nicht angegeben." Wenn dies auch für lua_next() gilt, werden die Werte möglicherweise nicht in der erwarteten Reihenfolge angezeigt. – mkluwe

-1

Sie können auch verwenden lua_objlen:

Gibt die "Länge" des Wert bei der gegebenen akzeptablen Index: für Streicher, diese ist die Zeichenfolge Länge; für Tabellen ist dies das Ergebnis des Längenoperators ('#'); für userdata, dies ist die Größe des Speicherblocks, der für die userdata reserviert ist; für andere Werte, ist es 0.

+0

F: Wie übertrage ich eine Tabelle von Lua in C++? A: Benutze 'lua_objlen'. – cubuspl42

2

Dies würde mein Versuch (ohne Fehlerprüfung) sein:

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