0Pricing
Lua Academy · Урок

Вызов функций Lua из C

Загружайте и выполняйте скрипты и функции Lua из кода C.

«Вызов функций Lua из C» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Обзор

Чтобы вызвать функцию Lua из C, поместите в стек функцию, поместите аргументы, вызовите lua_pcall, а затем считайте результаты из стека.

Загрузка сценария Lua

luaL_dofile(L, filename) загружает и выполняет файл Lua. Либо используйте luaL_loadfile и lua_pcall для раздельной загрузки и вызова.

// C code
if (luaL_dofile(L, "config.lua") != LUA_OK) {
  fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));
  lua_pop(L, 1);
}

Получение глобальной функции

Используйте lua_getglobal(L, "funcName"), чтобы поместить глобальную функцию Lua в стек.

// C code
lua_getglobal(L, "myFunction"); // push function
lua_pushnumber(L, 10);          // push arg1
lua_pushnumber(L, 20);          // push arg2

lua_pcall

lua_pcall(L, nargs, nresults, errfunc) вызывает функцию в стеке. При успехе возвращает LUA_OK и оставляет результаты в стеке.

// C code
if (lua_pcall(L, 2, 1, 0) != LUA_OK) {
  fprintf(stderr, "Call error: %s\n", lua_tostring(L, -1));
  lua_pop(L, 1);
} else {
  double result = lua_tonumber(L, -1);
  lua_pop(L, 1);
  printf("Result: %f\n", result);
}

Несколько возвращаемых значений

Укажите nresults в lua_pcall, чтобы считывать несколько возвращаемых значений. Они помещаются в стек по порядку.

// C: calling a Lua fn that returns two values
lua_getglobal(L, "minmax");
lua_pushnumber(L, 5); lua_pushnumber(L, 3);
lua_pcall(L, 2, 2, 0);
double mn = lua_tonumber(L, -2);
double mx = lua_tonumber(L, -1);
lua_pop(L, 2);

LUA_MULTRET

Передайте LUA_MULTRET в качестве nresults, чтобы принять все возвращаемые функцией значения. После этого проверьте lua_gettop(L), чтобы узнать, сколько значений было возвращено.

Обработчик ошибок

Передайте ненулевой errfunc в lua_pcall, чтобы использовать пользовательский обработчик ошибок. Обработчик получает объект ошибки и может добавить информацию о трассировке стека.

// C: setup traceback handler
lua_getglobal(L, "debug");
lua_getfield(L, -1, "traceback");
lua_remove(L, -2);  // remove debug table
int errhandler = lua_gettop(L);
// push fn and args, then:
lua_pcall(L, nargs, nresults, errhandler);

Вызов методов объектов

Чтобы вызвать метод объекта Lua, поместите в стек метод, поместите объект (self), поместите остальные аргументы, а затем выполните вызов.

Передача таблиц в качестве аргументов

Создайте таблицу в стеке с помощью lua_newtable, заполните её поля с помощью lua_setfield, а затем передайте её как аргумент функции.

Реестр ссылок

Используйте luaL_ref(L, LUA_REGISTRYINDEX), чтобы сохранить значение Lua в реестре и получить целочисленный ключ для последующего извлечения.

// C: store a callback for later use
lua_pushvalue(L, callbackIdx);
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
// Later: lua_rawgeti(L, LUA_REGISTRYINDEX, ref);

Очистка

Всегда извлекайте из стека неиспользуемые значения. Несбалансированный стек увеличивается после множества вызовов и в итоге переполняется. Проверяйте размер стека в отладочных сборках.

Вопрос о lua_pcall

Что делает lua_pcall(L, 2, 1, 0)?

Итоги: вызов Lua из C

Поместите в стек функцию и аргументы, вызовите lua_pcall, проверьте код возврата, а затем считайте результаты из стека. Используйте luaL_ref, чтобы сохранить обратные вызовы Lua для последующего использования. Всегда извлекайте неиспользуемые значения из стека.

Часто задаваемые вопросы

Урок «Вызов функций Lua из C» бесплатный?

Да — полный текст урока «Вызов функций Lua из C» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Вызов функций Lua из C»?

Загружайте и выполняйте скрипты и функции Lua из кода C. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Вызов функций Lua из C»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Модель стека C API Lua
  2. Вызов функций Lua из C
  3. Регистрация функций C в Lua
  4. Управление состоянием и обработка ошибок
← Назад к Lua Academy