2015-07-02 2 views
4

Мой файл Lua под названием "add4c.lua", Lua код так:С вызовом функции Lua в цикле

function lua_sum(x,y,z) 
    return x+y+z 
end 

Мой код C файл как:

#include "D:/luac/include/lua.h" 
#include "D:/luac/include/lualib.h" 
#include "D:/luac/include/lauxlib.h" 
#include <stdlib.h> 

#pragma comment(lib,"D:/luac/lib/lua51.lib") 





int main(void) 
{ 

    lua_State *L = luaL_newstate(); 
    luaopen_base(L); 
    luaL_openlibs(L); 

    int error = luaL_dofile(L, "add4c.lua"); 


    double r; 
    for (int i = 0; i <= 200; i++){ 
     lua_getglobal(L, "lua_sum"); 
     lua_pushnumber(L, i+1); 
     lua_pushnumber(L, i+2); 
     lua_pushnumber(L, i+3); 
     lua_call(L, 3, 1); 
     r = lua_tonumber(L, -1); 
     printf("%d\n", i); 
     lua_pop(L, 4); 
    } 

    lua_close(L); 


    return 0; 
} 

Моя Lua версия является 5.1.4, а мой код c скомпилирован Visual Studio 2013. При запуске этого кода он вызывает ошибку, просто останавливает код, но не имеет сообщения, и если я изменяю предложение цикла как «i < = 10», оно отлично работает, как это исправить?

ответ

4

lua_call(L, 3, 1) потребляет 3 значения стека и оставляет 1, когда это будет сделано. Таким образом, после lua_call(L, 3, 1) в стеке есть только одно значение, и поэтому lua_pop(L, 4) выдает слишком много значений и выходит за пределы внутреннего стека, а значит и сбой. Вместо этого используйте lua_pop(L, 1).

Если вы перестроили Lua с LUA_USE_APICHECK, то вы получите сообщение об ошибке от внутреннего подтверждения при первом вызове lua_pop(L, 4).

+0

BTW, вместо использования lua_getglobal (L, "lua_sum") в теле цикла, есть ли способ кэшировать функцию lua_sum, поэтому я могу просто загрузить функцию Lua только один раз. – user1021531

+0

@ user1021531, да, вызовите 'lua_getglobal' один раз за пределами цикла и вызовите' lua_pushvalue (L, -1) 'в теле. – lhf

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