2015-06-07 37 views
2

我希望能夠做到以下幾點:Lua的就地初始化表的順序

MyObject:SetSize({ 10.0, 20.0 }) 

但是,當我遍歷這個在C端(是的setSize C函數)。參數的順序是隨機的。

這是C++側處理表:

glm::vec2 State::PopVec2() 
{ 
    glm::vec2 v(); 

    lua_pushnil(ls); // first key 

    int i = 0; 
    while(lua_next(ls, -2)) // pops key and pushes next key and value 
    { 
     // v[0] is x coordinate. v[1] is y coordinate. 
     v[i] = (float)lua_tonumber(ls, -1); // get number 

     lua_pop(ls, 1);// pop value but leave next key. 

     ++i; 
    } 

    lua_pop(ls, 1); // pop table 

    return v; 
} 

我怎麼能保證一致的順序,而不必陷入困境的LUA端的代碼? (所以基本上在C++端解決這個問題)

或者,我應該在lua端使用什麼作爲「Vec2」等效物?

+0

你可以在訪問表的C端顯示代碼嗎? – ryanpattison

+0

@rpattiso添加 – akaltar

+1

你可以使用['rawgeti'來獲取ipairs行爲](http://stackoverflow.com/questions/14149178/how-to-produce-ipairs-as-opposed-to-pairs-behavior-in -the-c-api) – ryanpattison

回答

3

您應該將1和2推入棧(或0,1如果表是0索引)並使用lua_geti而不是使用lua_next遍歷表。當前代碼不正確的另一個例子是如果Lua用戶通過{1, 2, 3}會發生什麼?您將訪問2元素向量的第3個元素。

+0

我在代碼中使用了'i%2',但是在這裏簡化了它。 – akaltar

+0

我認爲這仍然有點令人困惑。如果lua_tonumber不是數字,它會返回什麼? – Puppy

+0

它會失敗,但我改變它,因爲它不好,現在它處理所有這一切都很好。 – akaltar