gpt4 book ai didi

c - 检测lua表爬行中的无限循环

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:23 26 4
gpt4 key购买 nike

我正在尝试使用 lua c api 遍历全局命名空间及其所有内容。我遇到的一个问题是表格中的 self 引用。我正在使用扁平化表格方法来确定条目是否存在,但是对于嵌套数字表格,这会失败,例如:

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);

然后我稍后检查该变量是否存在,如果存在,我将停止在 table 上走动。但是,这并没有阻止处理自引用表时的无限递归。这里有更好的方法/一些有缺陷的逻辑吗?给定表的第二次相遇是否会给我一个不同的指针?我见过多种基于 lua 的方式来抓取表,但没有看到任何基于 c 的方式。

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

最佳答案

我不确定“使用扁平化表格方法”是什么意思;但是在你的代码中的某个地方你必须检查给定的值是否是一个表(这样你就可以在里面检查)。最简单的方法是保留一组所有已访问过的表,对于你找到的表,首先检查它是否已经存在,这样你就不会爬取它两次。

关于c - 检测lua表爬行中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17322940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com