Вызов функции Lua без выполнения скрипта - PullRequest
7 голосов
/ 27 февраля 2010

Я встраиваю Lua в приложение C / C ++. Есть ли способ вызвать функцию Lua из C / C ++, не выполняя сначала весь сценарий?

Я пытался сделать это:

//call lua script from C/C++ program
luaL_loadfile(L,"hello.lua");

//call lua function from C/C++ program
lua_getglobal(L,"bar");
lua_call(L,0,0);

Но это дает мне это:

PANIC: unprotected error in call to Lua API (attempt to call a nil value)

Я могу вызывать bar () только тогда, когда я делаю это:

//call lua script from C/C++ program
luaL_dofile(L,"hello.lua");  //this executes the script once, which I don't like

//call lua function from C/C++ program
lua_getglobal(L,"bar");
lua_call(L,0,0);

Но это дает мне это:

hello
stackoverflow!!

Я хочу это:

stackoverflow!

Это мой сценарий Луа:

print("hello");

function bar()
 print("stackoverflow!");
end

Ответы [ 3 ]

13 голосов
/ 27 февраля 2010

Как только что обсуждалось в #lua на freenode, luaL_loadfile просто компилирует файл в вызываемый фрагмент, в этот момент ни один код внутри файла не был запущен (который включает определения функций), как таковой, чтобы получить определение из bar для вызова чанка (это то, что делает luaL_dofile).

1 голос
/ 27 февраля 2010

Обнаружено, что для вызова функции необходимо запустить скрипт.

0 голосов
/ 02 июня 2016

Одно из возможных решений / взлом (и , пожалуйста, , помните, что в настоящее время я не могу это проверить) ...


Вставьте фиктивный "возврат"; строка в верхней части вашего кода LUA.

  • Загрузите ваш файл в строку (как при подготовке к использованию luaL_loadstring())
  • Теперь это будет простой вопрос использования printf_s("return;\r\n%s", <b>[pointer to string holding actual LUA code]</b>)
  • Теперь вы можете luaL_loadstring() каскадная строка

Код по-прежнему будет выполняться, но он должен быть обрезан, прежде чем он сможет реально достичь чего-либо, что что-то делает (в вашем примере print("hello"); строка печати станет недоступной). Он должен по-прежнему обновлять список всех прототипов функций, и теперь вы должны иметь возможность использовать lua_get() для ссылки на функции.


ПРИМЕЧАНИЕ. Для тех, кто не знает, "\ r \ n" - это escape-коды, представляющие новую строку в ОС Windows, и они должны быть ДОЛЖНЫ . IE: ЭТО \ r \ n НЕ ЭТО / r / n

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...