gpt4 book ai didi

c++ - 在 C api 中移动一个 lua 表

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:24 24 4
gpt4 key购买 nike

我正在尝试使用 lua C api 将一个表移动到另一个表。例如,我有一个具有这种结构的表:

a[b][c][d][e] = value

我想将表 d 移动到 a[b] 下,我可以在 Lua 中像这样完成:

a[b][d] = a[b][c][d]
a[b][c][d] = nil

我目前的方法是将 a[b][c][d] 表加载到堆栈上,因此堆栈看起来像:

Index  Value
-1 d table
-2 c table
-3 b table
-4 a table

然后将 a[b] 加载到堆栈上,所以它看起来像:

Index  Value
-1 b table
-2 a table
-3 d table
-4 c table
-5 b table
-6 a table

然后将d的key入栈,将d的key和b表插入到d表下,所以栈为:

Index  Value
-1 d table
-2 d key
-3 b table
-4 a table
-5 c table
-6 b table
-7 a table

然后我使用 lua_settable(L, -3) 来做 b[d] = d。

此方法适用于非表键,但不适用于表键。所以它会因为类似的事情而失败:

a[b][c][{}][d] = value
a[b] = a[b][c][{}][d]

注意,我在上面知道它会在上面给出的 lua 中失败,因为键将是一个新的 lua 表,我只是想说明一下。

我试过在 parents 表中走下去(所以做 a[b] = b, lua_setglobal(L, a))也没有任何运气。有谁知道我哪里出错了?

编辑:关于我如何将键/值插入堆栈的小代码片段。这里的目标是将一个表从一个表结构移动到另一个表结构(或者如我在代码中所说的那样,重新设置它的父级)

http://pastebin.com/Y4540Wss

解决方法:

问题是该表有一些元表函数阻止了对表的更改(本质上,编写脚本的人有一个结构很重要的配置表,因此导致了这个问题。)

最佳答案

如果我没有正确理解你的描述,这段 Lua 代码可以满足你的要求:

local ab = a[b]
ab[d], ab[c][d] = ab[c][d], nil

关于在 Lua C API 中实现它,lua2c对机器翻译有帮助:

enum { lc_nformalargs = 0 };
const int lc_nactualargs = lua_gettop(L);
const int lc_nextra = (lc_nactualargs - lc_nformalargs);

/* local ab = a[b] */
lua_getfield(L,LUA_ENVIRONINDEX,"a");
lua_getfield(L,LUA_ENVIRONINDEX,"b");
lua_gettable(L,-2);
lua_remove(L,-2);
assert(lua_gettop(L) - lc_nextra == 1);

/* ab[d], ab[c][d] = ab[c][d], nil */
lua_getfield(L,LUA_ENVIRONINDEX,"c");
lua_gettable(L,(1 + lc_nextra));
lua_getfield(L,LUA_ENVIRONINDEX,"d");
lua_gettable(L,-2);
lua_remove(L,-2);
lua_pushnil(L);
lua_getfield(L,LUA_ENVIRONINDEX,"c");
lua_gettable(L,(1 + lc_nextra));
lua_insert(L,-2);
lua_getfield(L,LUA_ENVIRONINDEX,"d");
lua_insert(L,-2);
lua_settable(L,-3);
lua_pop(L,1);
lua_getfield(L,LUA_ENVIRONINDEX,"d");
lua_insert(L,-2);
lua_settable(L,(1 + lc_nextra));
assert(lua_gettop(L) - lc_nextra == 1);
return 0;

我还没有开发出一种可读的方式来编写堆栈操作。

关于c++ - 在 C api 中移动一个 lua 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17222267/

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