Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Lua C++;表迭代_C++_Lua - Fatal编程技术网

C++ Lua C++;表迭代

C++ Lua C++;表迭代,c++,lua,C++,Lua,我对lua_next的工作原理有点困惑。用户定义一个表: a={["a1"]=20,["a2"]=30} 我想用C++代码打印这个表: inline int lua_print(lua_State* L) { wxString wxReturnStr=wxEmptyString; wxString tempString=wxEmptyString; int nargs = lua_gettop(L); for (int i=1; i <= nargs; i++) { int t

我对lua_next的工作原理有点困惑。用户定义一个表:

a={["a1"]=20,["a2"]=30}
我想用C++代码打印这个表:

inline int lua_print(lua_State* L)
{
wxString wxReturnStr=wxEmptyString;
wxString tempString=wxEmptyString;
int nargs = lua_gettop(L);

for (int i=1; i <= nargs; i++)
{
    int type = lua_type(L, i);
    switch (type)
    {

    case LUA_TNIL:
        break;

    case LUA_TBOOLEAN:
        tempString<<(lua_toboolean(L, i) ? "true" : "false");
        break;

    case LUA_TNUMBER:
        tempString<<lua_tonumber(L, i);
        break;

      case LUA_TSTRING:
          tempString<<lua_tostring(L, i);
        break;
      case LUA_TTABLE:
      {
          lua_pushnil(L);
          while(lua_next(L,-2))
          {
                const char* key=lua_tostring(L,-2);
                double val=lua_tonumber(L,-1);
                lua_pop(L,1);
                tempString<<key<<"="<<val<<"\t";
          }

          break;
      }

      default:
          tempString<<lua_typename(L, type);
        break;
    }

    wxReturnStr=wxReturnStr+tempString+"\n";
    tempString=wxEmptyString;

}

lua_pop(L,nargs);
但是,假设我在Lua中有一个表:

b={["b1"]=10, ["b2"]=15}
如果我将代码称为:

print(a,b) -- Twice prints only contents of b 
我对lua#u下一步工作的理解如下图所示:[Edition#1]


臭虫在哪里

处理完表格后,您忘记了lua_pop

 lua_pushnil(L);
      while(lua_next(L,-2))
      {
            const char* key=lua_tostring(L,-2);
            double val=lua_tonumber(L,-1);
            lua_pop(L,1);
            tempString<<key<<"="<<val<<"\t";
      }
 lua_pop(L, 1); // THE FIX, pops the nil on the stack used to process the table
什么也不印


关于堆栈的图形表示。每个图像下的命令表示调用该命令后的状态。因此,最后一个图像缺少堆栈上的[Key=a2]项。

错误出现在
lua_next(L,-2)
行中,因为-2表示堆栈顶部减去一,这恰好是
print
的最后一个参数

使用
lua\u next(L,i)


Upd:Lua堆栈索引在开发阶段移动代码时会浮动,因此一般建议是在获取/推送/考虑值之后使用sml
int t=Lua_gettop(L)
固定索引,并使用该
t
而不是
-n
(尽管这种特定情况似乎有点像击键错误)

如何分配
a
b
?OPs while循环不会在堆栈上留下nil,因为lua_下一步消耗初始nil,返回0时不推送任何内容。您建议在块的末尾使用
lua_pop(L,1)
,但我在这里发布之前实际上已经尝试过了,这一建议不起作用。例如,对于
print(a,b)
它只打印第一个参数,第二个参数在打印前弹出。您的建议
lua_next(L,i)
有效。然而,我现在很困惑。。。当我对I=1使用
lua_next(L,1)
时,我理解这是指堆栈的底部。然而,当我说
lua_pop(L,1)
时,这会从堆栈顶部弹出。我不确定它是如何工作的…@macroland一些函数将堆栈索引(1..top/-top..-1)作为参数,其他函数则进行计数。lua_next()、lua_tostring()、lua_getfield()获取堆栈索引。lua_pop(),lua_concat()获取要在堆栈顶部移除/连接的值的数量。不能从堆栈中间弹出,这就是lua_remove()存在的原因。如果有疑问,请查阅特定功能的文档。谢谢!当我们对i=1说
lua_next(L,i)
时,这指的是堆栈的底部,即绝对索引为1的元素。但是,当我们从堆栈中弹出时,唯一可以弹出的方法肯定是从顶部弹出。现在,如果堆栈上有两个表(表a位于索引1,表b位于索引2),当我们运行
lua\u next(L,1)
时,代码引用的是表a。这将从表a中“获取”值,并推送到堆栈上。现在使用idx=-1表示值,idx=-2表示键是有意义的。我的理解是lua_next在内部做了一些事情从堆栈中删除表a(索引为1)。我的理解是:lua_next()不会修改或删除表。它弹出该键并从该键旁边的哈希表bucket中推送键值对(如果该键是最后一个,则不推)。Nil被认为是“最小”键,因此您可以从Nil开始遍历所有表对。在每次迭代中弹出值会使下一个lua_next()调用的最后一个键保持在顶部,有效且自然地在所有键之间循环。请阅读文档,没有比描述更多或更少的行为。您的代码移动到
b
,是因为
i
的增量增加,而不是删除索引1处的值。
 lua_pushnil(L);
      while(lua_next(L,-2))
      {
            const char* key=lua_tostring(L,-2);
            double val=lua_tonumber(L,-1);
            lua_pop(L,1);
            tempString<<key<<"="<<val<<"\t";
      }
 lua_pop(L, 1); // THE FIX, pops the nil on the stack used to process the table
case LUA_TNIL:
   break;