gpt4 book ai didi

c++ - 从堆栈读取索引 0 的奇怪结果

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:44 25 4
gpt4 key购买 nike

通常 Lua 堆栈从索引 1 开始。但是,在读取通过调用 cfunction 提供的堆栈地址 0 时,我注意到一个奇怪的现象。

--lua tables defined via Lua C API
h{ }
u{ }
f{ u{ s{} } }
--table calls
h(2)
u(3)
f.u.s(4)

上面看到的所有表(hu 和嵌套的s)都有一个__call 元方法指向同一个函数。从那个 cfunction 我正在读取/转储传递的堆栈:

while(start_index <= lua_gettop(state)) {
switch(lua_type(state, start_index)) {
case LUA_TNUMBER:
std::cout << "LUA_TNUMBER:"<<lua_tonumber(state, start_index);
break;
//... dump for all the other types

start_index 从 1 开始时,输出符合预期:LUA_TABLE LUA_TNUMBER:3;它包含包含元方法(或者我认为如此)和参数 3 的表。


但是当 start_index 从 0 开始时,我认为结果不是有效的 Lua 类型,但它是。结果不一致:从 Lua 调用时,索引 0 始终是值为 5LUA_TNUMBER

当使用 pcall (lua_getfield, lua_pushnumber, lua_pcall) 从 C++ 调用时,索引 0 产生相同的 LUA_TNUMBER(5) 用于调用 f.u.s,但 LUA_TABLE 用于 hu

索引 0 是什么,为什么它是有效的 Lua 类型,为什么它的值如此奇怪地不一致?

最佳答案

0 不是有效的堆栈索引,因此您不能指望在那里找到任何东西。这有点像获取您的 lua_State 指针并取消引用 (lua_State - 1) 并询问其中的值是什么。这是垃圾。

来自Lua manual :

Any function in the API that receives stack indices works only with valid indices or acceptable indices.

A valid index is an index that refers to a real position within the stack, that is, its position lies between 1 and the stack top (1 = abs(index) = top).

An acceptable index can be any valid index, including the pseudo-indices, but it also can be any positive index after the stack top within the space allocated for the stack, that is, indices up to the stack size.

(Note that 0 is never an acceptable index)

查看源代码(参见 index2addr ),如果 Lua 是使用 LUA_USE_APICHECK 构建的,您的调用会抛出错误。

关于c++ - 从堆栈读取索引 0 的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434820/

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