C ++ Функция вызова из Lua скрипта

Я пытаюсь привязать Lua к своим приложениям, теперь я пытаюсь проверить, как привязать Lua к C ++. Моя проблема очень странная, потому что я хочу вызвать функцию main() из скрипта при запуске, после luaL_loadfile. Мой код:

#include <iostream>
#include <cstdlib>
#include <stdio.h>

#include "lua.hpp"
#include "lauxlib.h"
#include "lualib.h"

using namespace std;

int main(int argc, char **argv) {
    lua_State* lua = luaL_newstate();
    luaL_openlibs(lua);

    if (luaL_loadfile(lua, "test.lua") != 0) {
        std::cout << lua_tostring(lua, -1) << "\n";
        lua_pop(lua, 1);
        return 1;
    }

    lua_getfield(lua, LUA_REGISTRYINDEX, "main");
    if (lua_pcall(lua, 0, 1, 0) != 0) {
        printf("Error running function 'main': %s\n", lua_tostring(lua, -1));
        return 1;
    }

    lua_close(lua);

    return 0;
}

и мой результат:

Ошибка при запуске функции main: попытка вызвать нулевое значение


person rafalon    schedule 21.08.2013    source источник
comment
То, что вы пытаетесь сделать, не имеет абсолютно никакого смысла. main вызывается библиотекой времени выполнения C / C ++ в качестве точки входа в вашу программу. Зачем вам снова вызывать его из lua-скрипта ??   -  person greatwolf    schedule 22.08.2013
comment
Почему вы просто предполагаете, что в реестре Lua будет что-то под ключевой главный? Вы понимаете, что такое среда выполнения Lua (а что нет)?   -  person remram    schedule 23.08.2013


Ответы (2)


В этой статье я собрал пример встраивания lua 5.2 в консольный проект Visual Studio 2005 с исходным кодом Расширение приложения C ++ с помощью Lua 5.2.

Для вас действительно не имеет смысла вызывать main () из вашего lua-скрипта, поскольку main () является точкой входа для вашего приложения, и есть вещи инициализации Lua, которые вам нужно сделать, и сделать это только один раз.

Пример и статья, которые я собрал, показывают использование Lua 5.2 с C ++ и возможность вызывать функции C, которые вы создаете из своего сценария Lua. В этом примере также показан вызов функций Lua из программы C ++.

Я сделал это около года назад, используя Visual Studio 2005. Я подозреваю, что перейти с Visual Studio 2005 на 2012 будет несложно. Я не уверен, насколько просто было бы перенести его на другой компилятор и среду разработки. Как минимум, функцию _tmain (), используемую с консольным приложением Windows в Visual Studio 2005, необходимо переименовать в main ().

person Richard Chambers    schedule 21.08.2013
comment
Есть ли способ загрузить любые определенные функции из скрипта без luaL_dofile? - person rafalon; 22.08.2013
comment
По моему опыту, у меня есть фрагменты Lua, которые хранятся в одном или нескольких файлах. Я загружаю различные фрагменты Lua в движок Lua, где они затем становятся доступными для использования, например, с помощью lua_pcall () или аналогичной функции из приложения C / C ++. Я не уверен, что именно вы пытаетесь выполнить, поэтому было бы неплохо получить более подробную информацию об этом. Обычно люди используют движок Lua вместе с приложением и предоставляют различные функции, которые сценарий Lua может вызывать для создания сценария или автоматизации функций в приложении. - person Richard Chambers; 22.08.2013
comment
Есть способ загрузить любые определенные функции из скрипта без luaL_dofile function() ... end - это оператор, код должен быть выполнен для получения значения функции. - person Textmode; 26.08.2013

Попробуйте luaL_dofile вместо luaL_loadfile.

Это одна из наиболее частых ошибок: luaL_loadfile загружает файл, но не запускает его; он просто оставляет в стеке функцию, представляющую загруженный файл, готовую к вызову. Функция main будет определена только при запуске сценария, то есть при вызове функции сценария. Сообщение об ошибке пытается вам сказать об этом. (Я предполагаю, что ваш сценарий определяет функцию с именем main. В этом нет никакой реальной необходимости, но это безвредно.)

person lhf    schedule 22.08.2013