2013-12-04 3 views
5

У меня проблемы с получением функции Lua 5.2 для вызова из C++.Lua 5.2 issue: «попытка вызвать значение nil» из lua_pcall

Это кусок 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 fine (ошибка не возвращается), тогда он показывает, что высота стека равна 3 после вызова lua_getglobal с именем функции.

Однако он не работает в lua_pcall с кодом ошибки 2: «попытка вызвать значение nil».

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

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

Я что-то неправильно понял ???

+0

Функция печати не загружена. 'luaL_openlibs' должен загрузить его. – Simple

ответ

3

luaL_loadfile просто загружает файл, он не запускает его. Вместо этого попробуйте luaL_dofile.

Вы по-прежнему получаете сообщение об ошибке, поскольку print определен в базовой библиотеке, а не в библиотеке io. Поэтому позвоните по телефону luaopen_base.

+0

Спасибо, теперь у меня это работает, изменив мой C++, как вы предложили. Теперь я понимаю, что для функции из блока, который должен быть зарегистрирован, он должен быть «запущен» не просто «загружен» в терминологии Lua. Спасибо за ваш ответ! – user2795503

+0

@ user2795503 не забудьте «принять» ответ, если он решил проблему. – Schollii

1

Вам необходимо позвонить «priming lua_pacll()» перед lua_getglobal(). См. Calling Lua From a C Program. Весь код должен выглядеть так:

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); 
Смежные вопросы