2013-08-21 4 views
1

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

#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; 
} 

и мой выход:

Ошибка при выполнении функции «основной»: попытка называть нулевой стоимости

+1

То, что вы пытаетесь сделать, абсолютно не имеет смысла. 'main' вызывается библиотекой времени выполнения C/C++ в качестве точки входа в вашу программу. Почему вы хотите снова называть его с помощью сценария lua? – greatwolf

+0

Почему вы просто предположили, что у реестра [Lua] (http://www.lua.org/manual/5.1/manual.html#3.5) есть что-то под ключом «main»? Вы понимаете, что такое время выполнения Lua (и нет)? – remram

ответ

2

я соединял пример вложения Lua 5.2 в консольный проект Visual Studio 2005 в этой статье с источником, Extending a C++ Application with 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().

+0

Есть способ загрузить любые определенные функции из скрипта без 'luaL_dofile'? – rafalon

+0

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

+0

«Существует способ загрузить любые определенные функции из сценария без luaL_dofile» 'function() ... end' является * оператором *, код должен быть выполнен для создания значения функции. – Textmode

2

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

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

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