2014-09-18 6 views
2

Я попытался получить возвращаемое значение функции C через библиотеку Lua, но не удалось. Мой код выглядит следующим образом:Невозможно получить возвращаемое значение функции C из функции Lua

#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; 
} 

Я ожидаю, чтобы получить 1 значение с плавающей точкой, которая составляет около 0xBADF00D в L после lua_call(). Однако фактический результат - No data in stack.

Как я могу получить значение, толкаемое в стек в testcmd()?

+2

Вам нужно 'return testcmd()' как ваш кусок, чтобы он возвращал значение вместо того, чтобы просто выбросить его. –

+0

@EtanReisner Я действительно не получаю, где я должен «возвращать testcmd()', чтобы сделать 'L', содержащий значение в верхней части стека. У меня есть 'lua_pushnumber()' 'ed в' testcmd() '. Разве это не правильно? – timrau

+1

Да, это говорит функции C, чтобы вернуть значение, но когда вы * вызываете * функцию из lua, ваш оператор 'testcmd()', который ничего не делает с возвращаемым значением, поэтому он не возвращается из куска , 'return testcmd()' - это строка, которую нужно выполнить для этого. Вы не выполняете прямой вызов 'testcmd' там, где вы выполняете код lua, который * вызывает *' testcmd'. –

ответ

2

Вы сказали функции C, чтобы вернуть значение lua при вызове (это то, что делает значение в стеке и возвращает 1).

То, что вы еще не сделали, - это возврат, возвращаемый значением из блока lua, который вы используете.

Когда вы вызываете функцию из lua (используя luaL_loadbuffer(L, "testcmd()", 9, "line");), ваш оператор для запуска - testcmd(), который ничего не делает с возвращаемым значением, чтобы он не возвращался из этого фрагмента.

return testcmd() - код, который необходимо запустить для этого.

Напомним, что с этим luaL_loadbuffer/lua_pcall парами вы не осуществляете прямой вызов testcmd. Скорее, вы выполняете код lua, который вызывает testcmd.

Смежные вопросы