【问题标题】:Lua in-place initialized table orderLua就地初始化表顺序
【发布时间】:2015-06-08 04:48:05
【问题描述】:

我希望能够做到以下几点:

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”等效项?

【问题讨论】:

  • 能否在C端显示访问表的代码。
  • 更好,简单地推送 1 和 2(或者 0 和 1,不记得 Lua 表是否为 0 索引)和 lua_geti 而不是使用 lua_next。
  • @Puppy 你能把它作为答案发布以便我接受吗?

标签: c++ lua


【解决方案1】:

您应该将 1 和 2 压入堆栈(如果表是 0indexed,则为 0,1)并使用 lua_geti 而不是使用 lua_next 遍历表。另一个你当前代码不正确的例子是如果 Lua 用户通过 {1, 2, 3} 会发生什么?您将访问 2 元素向量的第 3 个元素。

【讨论】:

  • 我在代码中使用了i % 2,但在这里对其进行了简化。
  • 我认为这仍然会让人感到困惑。如果不是数字,lua_tonumber 会返回什么?
  • 它会失败,但我改变了它,因为它不好,现在它处理所有这些都很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2023-03-12
  • 2010-09-17
  • 1970-01-01
  • 2017-07-07
  • 2019-10-14
  • 2012-03-19
相关资源
最近更新 更多