Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
luaapi:pcall错误后堆栈为空_C_Lua - Fatal编程技术网

luaapi:pcall错误后堆栈为空

luaapi:pcall错误后堆栈为空,c,lua,C,Lua,我在使用LUCAPI时遇到问题。当pcall(C API函数)失败时,错误被推送到堆栈上。 lua\u-tostring显示堆栈上的错误,但lua\u-gettopshows表示堆栈为空 #include <lua5.2/lauxlib.h> #include <lua5.2/lua.h> #include <lua5.2/lualib.h> int main() { lua_State *L = luaL_newstate(); lua_p

我在使用LUCAPI时遇到问题。当pcall(C API函数)失败时,错误被推送到堆栈上。
lua\u-tostring
显示堆栈上的错误,但
lua\u-gettop
shows表示堆栈为空

#include <lua5.2/lauxlib.h>
#include <lua5.2/lua.h>
#include <lua5.2/lualib.h>

int main()
{
    lua_State *L = luaL_newstate();
    lua_pcall(L, 0, 0, 0);
    printf("%d\n", lua_gettop(L)); // outputs 0, indicating empty stack
    printf("%s\n", lua_tostring(L, -1)); // outputs "attempt to call a nil value", indicating non-empty stack
}
#包括
#包括
#包括
int main()
{
lua_State*L=luaL_newstate();
lua_pcall(L,0,0,0);
printf(“%d\n”,lua_gettop(L));//输出0,表示堆栈为空
printf(“%s\n”,lua_tostring(L,-1));//输出“尝试调用nil值”,表示堆栈非空
}
使用:gcc main.c`pkg config--cflags lua5.2``pkg config--libs lua5.2编译`

此程序显示: 0 尝试调用nil值

lua_gettop(L)返回堆栈大小。我得到了0。如何从空堆栈中获取字符串


行为与5.1版本相同。

这已在Lua邮件列表中得到回答。行为是正确的:您需要将函数推送到堆栈上才能调用它。
luaL_newstate
之后的堆栈为空

#include <lua5.2/lauxlib.h>
#include <lua5.2/lua.h>
#include <lua5.2/lualib.h>

int main()
{
    lua_State *L = luaL_newstate();
    lua_pcall(L, 0, 0, 0);
    printf("%d\n", lua_gettop(L)); // outputs 0, indicating empty stack
    printf("%s\n", lua_tostring(L, -1)); // outputs "attempt to call a nil value", indicating non-empty stack
}
编辑: OP说:“我如何从空堆栈中获取字符串?”。我的答案是:既然
lua_gettop
返回了0,那么当您知道它是空的时,为什么要从空堆栈中获取某些内容

底线:

  • 调用
    lua\u pcall
    之前堆栈为空。这是一个错误。Lua康复了,但你不能指望
  • lua\u pcall
    之后堆栈为空。Lua这么想,并通过
    Lua\u gettop
    告诉你
  • 您不应该尝试从空堆栈中获取值。打印的字符串只是
    lua\u pcall
    留下的垃圾,但您不能指望它

据我所知,lua_pcall不会推送错误字符串。相反,它会覆盖堆栈顶部的值(因为那里应该始终至少有一个函数;p)。因此,lua_pcall(或者更准确地说,我相信是debug.traceback)盲目地覆盖堆栈顶部,而不是修改堆栈指针

因此,当lua_pcall返回时,该值位于堆栈顶部,但堆栈指针表示堆栈为空(就像调用lua_pcall时一样)


我认为这是一种避免更严重错误的措施(例如,如果出现内存损坏或内存不足错误,我们不希望为错误消息分配更多堆栈空间,是吗?)。

我认为您误解了这个问题。他知道堆栈在
luaL_newstate
之后是空的,他知道需要在堆栈上推一个函数来调用它;他故意强迫pcall产生一个错误。问题是为什么pcall将错误消息推送到堆栈顶部后,堆栈顶部仍然为0?他的输出显示堆栈上有一条错误消息(“尝试调用一个nil值”),但
lua_gettop
返回0,根据手册,该值为0。@Mud,lua API不牵手。如果你给它垃圾,你可能会得到垃圾
lua_pcall
假定堆栈上有一个要调用的函数。您的编辑说“如何从空堆栈中获取字符串?”,但它不是空的:它上面有一个字符串
lua_tostring
证明了这一点。我猜答案是调用
lua_pcall
而不首先将某个东西推到堆栈上(甚至是nil)会使堆栈处于垃圾状态,在这种状态下,它会报告为空,而实际上它不是。@Mud,堆栈是空的,因为
lua_gettop
返回了0。我已经编辑了我的答案。