lua, вызов скрипта из C с ограниченными модулями, ошибка на string.len - PullRequest
1 голос
/ 09 мая 2020

Тестирую на предмет вызова LUA скриптов из C. LUA 5.3.5.

Чтобы ужесточить используемые библиотеки, в C я использую

L = luaL_newstate();
luaopen_base(L);
luaopen_string(L);
luaL_dofile(L, szFilename);
int tipo = lua_getglobal(L, "check");
int error = lua_pcall(L, 0, 0, 0);

(код упрощен и без обработки ошибок)

Это это пример LUA скрипта:

function check()
        local buffer = "hello"
        buffer = buffer .. " world!"
        print(buffer)
        print(string.len(buffer))
end

Почему string.len возвращает ошибку?

пытается проиндексировать нулевое значение (глобальная 'строка ')

Я думал, что luaopen_string загружает библиотеку строк.

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

luaopen_string не определяет глобальную переменную string: она просто оставляет таблицу в стеке. Так что сделайте

luaopen_string(L);
lua_setglobal(L,"string");

В качестве альтернативы используйте luaL_requiref вместо прямого вызова luaopen_string:

luaL_requiref(L,"string", luaopen_string,1);

См. Последний абзац раздела 6 в руководстве;

Чтобы получить доступ к этим библиотекам, хост-программа C должна вызвать функцию luaL_openlibs, которая открывает все стандартные библиотеки. В качестве альтернативы хост-программа может открывать их индивидуально, используя luaL_requiref для вызова ... luaopen_string (для строковой библиотеки) ... Эти функции объявлены в lualib.h.

Наконец, если вы хотите настроить набор стандартных библиотек, которые использует ваша программа, отредактируйте linit. c и добавьте его в свой проект. Измените список в loadedlibs . Тогда звоните luaL_openlibs.

0 голосов
/ 12 мая 2020

После разговора по списку рассылки LUA лучший совет, который я получил, - это посмотреть исходный код.

luaL_openlibs определено в linit. c

LUALIB_API void luaL_openlibs (lua_State *L) {
  const luaL_Reg *lib;
  /* "require" functions from 'loadedlibs' and set results to global table */
  for (lib = loadedlibs; lib->func; lib++) {
    luaL_requiref(L, lib->name, lib->func, 1);
    lua_pop(L, 1);  /* remove lib */
  }
}

Итак, чтобы загружать только библиотеки base и string , решение для LUA 5.3:

 luaL_requiref(L, "_G", luaopen_base, 1);
 lua_pop(L, 1);
 luaL_requiref(L, LUA_STRLIBNAME, luaopen_string, 1);
 lua_pop(L, 1);

И для LUA 5,4

 luaL_requiref(L, LUA_GNAME, luaopen_base, 1);
 lua_pop(L, 1);
 luaL_requiref(L, LUA_STRLIBNAME, luaopen_string, 1);
 lua_pop(L, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...