강좌 LUA_MULTRET이 예상대로 작동하지 않습니다.



lua 강좌 pdf (1)

첫 번째 호출에서 스택에 C 함수 foo를 밀고 호출합니다. 하지만 luaL_loadstring은 청크를 생성하므로 두 번째 및 세 번째 호출에서 청크를 누른 다음 호출하지만 청크는 아무것도 반환하지 않습니다. 청크는 foo ()를 호출합니다. 금후

lua_pcall(L, 0, 3, 0);

Lua 스택에 3 nils를 생성합니다. 왜냐하면 Lua는 요청한 3 개의 값이 청크가 아무 것도 반환하지 않더라도 거기에 있는지 확인하기 때문입니다. 또한

lua_pcall(L, 0, LUA_MULTRET, 0);

청크가 아무것도 반환하지 않았기 때문에 아무 것도 반환하지 않습니다.

Lua에서 foo를 실행하려면 foo 전역 변수를 스택에 넣으십시오.

lua_getglobal(L, "foo");
lua_pcall(L, 0, LUA_MULTRET, 0);

교대로, 청크가 foo ()가 반환하는 것을 반환하도록하십시오 :

luaL_loadstring(L, "return foo()");
lua_pcall(L, 0, LUA_MULTRET, 0);

이것은 거의이 질문과 중복됩니다. 그러나, 거기에 내 문제를 해결하지 않는 제안 대답을 luaL_dostring() 매크로를 직접 (비록 내가 그것을 확장하는 호출을 동일한 쌍을 사용하고 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, 0, 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, 0, 3, 0);
    nresults = lua_gettop(L);
    printf("After foo(): %d results left on the stack...\n", nresults);
    lua_settop(L, 0);

    // But this does NOT. Why?
    luaL_loadstring(L, "foo()");
    lua_pcall(L, 0, LUA_MULTRET, 0);
    nresults = lua_gettop(L);
    printf("After foo(): %d results left on the stack...\n", nresults);
    return 0;
}

lua_pcall(L, 0, LUA_MULTRET, 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...

루아 5.1.5를 사용하고 있습니다 ...