检测lua表遍历中的无限循环

我正在尝试使用lua cApi遍历全局命名空间及其所有内容。我遇到的一个问题是表中的自引用。我使用了扁平化表的方法来确定条目是否存在,但对于嵌套的数字表(例如:),这种方法将无法正常工作:

a = {[1] = {[1]={[1]=true}}}

```

键名1将会多次触发重复条目的错误。为了绕过这个问题,我采用了使用lua_topointer并将引用存储在映射中,并像这样检查(其中varUnit只是一个结构,用于跟踪已加载哪些变量):

    lua_pushvalue(L,-1);      const void *kp = lua_topointer(L,-1);      var->kpointer = kp;      varUnit->addPointer(kp);      lua_pop(L,1);      lua_pushvalue(L,-2);      const void *vp = lua_topointer(L,-1);      var->vpointer = vp;      varUnit->addPointer(vp);      lua_pop(L,1); 

```

然后我稍后检查该变量是否存在,如果存在,则停止遍历表。但是,在处理自引用表时,这并没有防止无限递归。是否有更好的方法/存在一些错误的逻辑?在给定表的第二次遇到中,是否会给我不同的指针?我已经看到了多种基于lua的遍历表的方法,但没有基于C的。

编辑: 关闭问题,是一个愚蠢的错误,我在为变量分配指针之前检查指针是否重复。

点赞
用户11649
用户11649

我不确定你所说的“使用平坦化表格方法”是什么意思;但是在你的代码中,你必须检查给定的值是否为表格(这样你才能在其中检查)。最简单的方法是保持一个所有已经访问的表格的集合,对于你发现的一个表格,首先检查它是否已经存在,这样你就不会两次爬取它。

2013-06-26 14:33:21