LUA_MULTRET没有按预期工作
发布时间:2020-12-14 21:47:23 所属栏目:大数据 来源:网络整理
导读:这几乎是 this question的重复;但是,答案表明没有解决我的问题,而且我没有直接使用luaL_dostring()宏(虽然我使用它扩展到的同一对调用).鉴于此计划: #include string#include stdio.h#include stdlib.h#include lua.hppstatic int _foo(lua_State* L){ lua_
这几乎是
this question的重复;但是,答案表明没有解决我的问题,而且我没有直接使用luaL_dostring()宏(虽然我使用它扩展到的同一对调用).鉴于此计划:
#include <string> #include <stdio.h> #include <stdlib.h> #include <lua.hpp> static int _foo(lua_State* L) { lua_pushinteger(L,1); lua_pushinteger(L,2); lua_pushinteger(L,3); printf("In foo(): pushed %d elements...n",lua_gettop(L)); return 3; } int main() { lua_State* L = luaL_newstate(); luaL_openlibs(L); lua_pushcfunction(L,_foo); lua_setglobal(L,"foo"); // This leaves three results on the stack... lua_pushcfunction(L,_foo); lua_pcall(L,LUA_MULTRET,0); int nresults = lua_gettop(L); printf("After foo(): %d results left on the stack...n",nresults); lua_settop(L,0); // ... and so does this. luaL_loadstring(L,"foo()"); lua_pcall(L,3,0); nresults = lua_gettop(L); printf("After foo(): %d results left on the stack...n",0); // But this does NOT. Why? luaL_loadstring(L,nresults); return 0; } 为什么最后一次调用lua_pcall(L,0)不会在堆栈上留下任何结果?运行上述程序的输出是: In foo(): pushed 3 elements... After foo(): 3 results left on the stack... In foo(): pushed 3 elements... After foo(): 3 results left on the stack... In foo(): pushed 3 elements... After foo(): 0 results left on the stack... 我正在使用Lua 5.1.5 …… 解决方法
在第一次调用中,您将C函数foo推入堆栈然后调用它.但是luaL_loadstring创建了一个块,所以在第二次和第三次调用中你推送一个块然后调用它,但是块没有返回任何东西,块只调用foo().于是
lua_pcall(L,0); 在Lua堆栈上创建3个nil,因为Lua确保你提出的3个值都在那里,即使chunk没有返回.也 lua_pcall(L,0); 什么都不返回,因为块没有返回任何内容 如果你想从Lua执行foo,请将foo全局变量放在堆栈上: lua_getglobal(L,"foo"); lua_pcall(L,0); 或者,使块返回foo()返回的内容: luaL_loadstring(L,"return foo()"); lua_pcall(L,0); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |