2014-09-18 1 views
2

루아 라이브러리를 통해 C 함수의 반환 값을 얻으려고했지만 실패했습니다. 다음과 같이 내 코드는 다음과 같습니다루아 함수에서 C 함수 반환 값을 얻을 수 없습니다.

#include "lua.h" 
#include "lualib.h" 
#include "lauxlib.h" 
#include <stdio.h> 

static int testcmd(lua_State *L) 
{ 
    lua_pushnumber(L, 0xBADF00D); 
    return 1; 
} 

lua_State *initLua() 
{ 
    lua_State *L = luaL_newstate(); 
    lua_gc(L, LUA_GCSTOP, 0); 
    luaL_openlibs(L); 
    lua_register(L, "testcmd", testcmd); 
    lua_gc(L, LUA_GCRESTART, 0); 
    return L; 
} 

int main(void) 
{ 
    lua_State *L = initLua(); 
    int error = luaL_loadbuffer(L, "testcmd()", 9, "line"); 
    if (error) { printf("Error @ luaL_loadbuffer()\n"); return 0; } 
    lua_call(L, lua_gettop(L) - 1, LUA_MULTRET); 
    if (lua_gettop(L) > 0) { 
     int i; 
     for (i = 1; i <= lua_gettop(L); ++i) { 
      printf("%d: %g\n", i, lua_isnumber(L, i) ? lua_tonumber(L, i) : 0.0); 
     } 
    } else { 
     printf("No data in stack\n"); 
    } 
    lua_close(L); 

    return 0; 
} 

내가 lua_call() 후 약 0xBADF00DL에서를 1 개 부동 소수점 값을 얻을 것으로 기대합니다. 그러나 실제 결과는 No data in stack입니다.

testcmd()에 스택으로 푸시 된 값을 어떻게 얻을 수 있습니까?

+2

청크에'return testcmd()'가 있어야 값을 버리는 것이 아니라 값을 반환 할 수 있습니다. –

+0

@EtanReisner 스택 상단의 값을 포함하는'L '을 만들기 위해'testcmd()'를 돌려줘야 할 곳이 정말로 없습니다. 나는'testcmd()'에''lua_pushnumber()''를 가지고 있습니다. 맞지 않아? – timrau

+1

예, C 함수가 값을 반환하도록 알려주지 만, 루아로부터 함수를 호출 할 때 반환 값에 아무 것도하지 않는'testcmd()'가 있으므로 청크에서 반환되지 않습니다 . 'return testcmd()'는 실행하기 위해 실행해야하는 문자열입니다. 'testcmd'의 직접 호출을 실행하지 않고 *'testcmd'를 호출하는 코드를 실행하고 있습니다. –

답변

2

당신은 호출시 값을 반환하도록 C 함수에 지시했습니다 (이것은 스택에 값을 넣고 1을 반환하는 것입니다).

수행하지 않은 것은 실행중인 루아 청크에서 반환 된 값을 반환하는 것입니다.

lua에서 함수를 호출 할 때 (luaL_loadbuffer(L, "testcmd()", 9, "line"); 사용) 실행 문은 testcmd()입니다. 반환 값은 아무 것도하지 않으므로 해당 청크에서 반환되지 않습니다.

return testcmd()은 실행하기 위해 실행해야하는 코드입니다.

luaL_loadbuffer/lua_pcall 쌍을 사용하면 testcmd이라는 직접 호출을 실행하지 않습니다. 오히려, 당신은 testcmd을 호출하는 루아 코드를 실행하고있다.

관련 문제