2015-04-19 3 views
1

Я играю с C++ и Lua. Я пытаюсь добиться того, что C++ вызывает функцию Lua, передавая 2 аргумента и извлекает 1 результат. Эта функция вызывает функцию C++, которая возвращает результат добавления двух аргументов (целых чисел). Но я всегда получаю 0.C++ - Вызываемая функция Lua всегда возвращает 0

Lua скрипт:

function f (x, y) 
    return AddC(x, y) 
end 

C++ код:

#include "C:\Program Files (x86)\lua\5.3\include\lua.hpp" 
#include <iostream> 

class LuaState { 
public: 
    LuaState() : L(luaL_newstate()) {} 
    ~LuaState() { lua_close(L); } 

    inline operator lua_State*() { return L; } 
private: 
    lua_State* L; 
}; 

int Addition(lua_State* L) { 
    int amount = lua_gettop(L); 
    std::cerr << "number of arguments: " << amount << std::endl; 

    int first_number = lua_tointeger(L, 1); 
    int second_number = lua_tointeger(L, 2); 
    int result = first_number + second_number; 

    std::cerr << "Addition: " << first_number << " + " << second_number << " = " << result << std::endl; 

return result; 
} 

void InitializeLua(lua_State* L) { 

    luaL_openlibs(L); 
    luaopen_io(L); 
    luaopen_base(L); 
    luaopen_math(L); 

    lua_register(L, "AddC", Addition); 
} 

int main(int argc, char* argv[]) 
{ 

    int first_number {0}; 
    int second_number {0}; 
    int result {0}; 
    LuaState L; 

    InitializeLua(L); 

    std::cout << "First number: "; 
    std::cin >> first_number; 

    std::cout << "Second number: "; 
    std::cin >> second_number; 

    int status = luaL_loadfile(L, "script.lua");  
    luaL_dofile(L, "script.lua"); 
    lua_getglobal(L, "f"); 

    lua_pushnumber(L, first_number); 
    lua_pushnumber(L, second_number); 

    lua_pcall(L, 2, 1, 0); 
    result = lua_tointeger(L, -1); 

    std::cout << first_number << " + " << second_number << " = " << result << std::endl; 
    lua_pop(L, 1); 

    return 0; 
} 

Чтобы сохранить его как можно более коротким, я удалил проверку ошибок в этом фрагменте кода.

Я использовал эти 2 сайты/учебники в качестве справки:
https://csl.name/post/lua-and-cpp/
http://cc.byexamples.com/2008/07/15/calling-lua-function-from-c/

+1

родные функции расширения возвращают код ошибки, а не фактическое возвращаемое значение. Следовательно, 'return result;' не будет делать ничего хорошего. (просто подумайте об этом, как они вернут строку, или «nil», или таблицу, или даже число с плавающей запятой, если они имеют *, чтобы вернуть целое число (поскольку это подпись, которую ожидает 'lua_register')? –

+0

Ah okay Я вижу! Спасибо большое! – fallacy

ответ

2

Вы должны нажать на результат в стек. Возвращаемое значение в C указывает, сколько значений вы действительно возвращаете.

int Addition(lua_State* L) { 
    // ... 

    lua_pushnumber(L, result); 
    return 1; 
} 
+0

Хорошо, теперь я получаю это! Большое спасибо :)! – fallacy

+0

Не соответствует ли значение «return 0» числу возвращаемых значений (1 в данном случае)? – IllidanS4

+0

@ IllidanS4 Моя ошибка, спасибо за исправление. На этот раз я проверил ссылку [Programming in Lua] (http://www.lua.org/pil/26.1.html) – ligoore

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