Проблема Lua 5.2: "попытка вызвать нулевое значение" из lua_pcall

У меня проблемы с получением функции Lua 5.2 для вызова из C++.

Это кусок Lua (с именем test.lua):

function testFunction ()
print "Hello World"
end

И это C++:

int iErr = 0;

//Create a lua state
lua_State *lua = luaL_newstate();

// Load io library
luaopen_io (lua);

//load the chunk we want to execute (test.lua)
iErr = luaL_loadfile(lua, "test.lua");
if (iErr == 0) {
    printf("successfully loaded test.lua\n");

    // Push the function name onto the stack
    lua_getglobal(lua, "testFunction");
    printf("called lua_getglobal. lua stack height is now %d\n", lua_gettop(lua));

    //Call our function
    iErr = lua_pcall(lua, 0, 0, 0);
    if (iErr != 0) {
        printf("Error code %i attempting to call function: '%s'\n", iErr, lua_tostring(lua, -1));
    }

} else {
    printf("Error loading test.lua. Error code: %s\n", lua_tostring(lua, -1));        
}
lua_close (lua);

Когда я прослеживаю, я вижу, что он нормально загружает скрипт test.lua (ошибки не возвращаются), а затем показывает, что высота стека равна 3 после вызова lua_getglobal с именем функции.

Однако в lua_pcall происходит сбой с кодом ошибки 2: "попытка вызвать нулевое значение".

Я прочитал множество примеров кода Lua 5.2 и, похоже, не вижу, где я ошибаюсь. Похоже, это должно определенно работать (в соответствии с тем, что я прочитал).

Я проверил орфографию и чувствительность к регистру, и все совпадает.

Я что-то не так понял???

2 ответа

Решение

luaL_loadfile просто загружает файл, он не запускается. Пытаться luaL_dofile вместо.

Вы все равно получите ошибку, потому что print определяется в базовой библиотеке, а не в библиотеке io. Так что звоните luaopen_base вместо.

Тебе нужно позвонитьpriming lua_pacll()" до lua_getglobal(), Пожалуйста, обратитесь к разделу "Вызов Lua из программы на Си". Весь код должен выглядеть так:

int iErr = 0;

//Create a lua state
lua_State *lua = luaL_newstate();

// Load base library
luaopen_base (lua);

//load the chunk we want to execute (test.lua)
iErr = luaL_loadfile(lua, "test.lua");
if (iErr == 0) {
    printf("successfully loaded test.lua\n");

    //Call priming lua_pcall
    iErr = lua_pcall(lua, 0, 0, 0);
    if (iErr != 0) {
        printf("Error code %i attempting to call function: '%s'\n", iErr, lua_tostring(lua, -1));
    }

    // Push the function name onto the stack
    lua_getglobal(lua, "testFunction");
    printf("called lua_getglobal. lua stack height is now %d\n", lua_gettop(lua));

    //Call our function
    iErr = lua_pcall(lua, 0, 0, 0);
    if (iErr != 0) {
        printf("Error code %i attempting to call function: '%s'\n", iErr, lua_tostring(lua, -1));
    }

} else {
    printf("Error loading test.lua. Error code: %s\n", lua_tostring(lua, -1));        
}
lua_close (lua);
Другие вопросы по тегам