Фрагмент сайта вызова, который вы даете, не имеет смысла.У вас есть
lua_pushstring(L,"function");
if(!lua_pcall(L,1,0,0))
{
...
, который не показывает извлечение функции с именем "function", а скорее вызов того, что было на вершине стека, с первым аргументом, заданным в виде строки "function"
.
Возможно, вы имели в виду
lua_getglobal(L,"function");
if(!lua_pcall(L,0,0,0))
{
... // succcess
} else {
// examine the error from the call for useful information
fprintf(stderr, "lua_pcall: %s\n", lua_tostring(L,1));
}
Редактировать: Строка ошибки, возвращаемая из lua_pcall()
, вероятно, будет информативной.Для получения дополнительной информации также поместите подходящую функцию ошибки в стек и передайте ее индекс в качестве 4-го аргумента lua_pcall
.Хороший выбор - debug.traceback
.
void callback(lua_State *L, const char *fname)
{
int status
lua_getglobal(L,"debug"); // put debug.traceback on the stack
lua_getfield(L,-1,"traceback");
lua_remove(L,-2);
lua_getglobal(L,fname); // put function on the stack
status = lua_pcall(L,0,0,-2)
if (!status) // call it with no parameters and no return values
{
// succcess
} else {
// examine the error from the call for useful information
fprintf(stderr, "lua_pcall returned %d: %s\n", status, lua_tostring(L,1));
lua_pop(L,1); // remove error message from the stack
}
lua_pop(L,1); // remove debug.traceback from the stack
}
Edit2: После вашего разъяснения это все еще не имеет смысла.
Ваш код содержит следующие фрагменты:
lua_register(state,"function",function); //dozens of them
...
и более поздних версий
lua_getglobal(L,"require");
lua_pushstring(L,"function");
if(!lua_pcall(L,1,0,0))
{
...
Первый фрагмент создает глобальные переменные, значениями которых являются каждая функция C.Вы бы вызвали эти функции с get_global()
и lua_pcall()
, как описано в первой части моего ответа.
Второй фрагмент извлекает глобальное имя с именем require
и вызывает его со строкой "function"
какэто единственный аргумент.Эквивалент, выраженный в Lua, равен require"function"
, и он будет искать модуль с именем "function" в обычным способом .Даже при вызове require()
рекомендуется перехватить сообщение об ошибке и сообщить о нем.В этом случае, скорее всего, вам сообщат, что в длинном списке элементов, которые выглядело require
, не было найдено ни одного модуля с именем "function".
Но ничего, что вы написали, на самом деле не вызывает функциюсам по себе.
Но здесь есть большая проблема.Не совсем понятно, зачем вам нужно более одного состояния Lua, особенно в однопоточной программе.Возможно ли, что [сопрограммы] [2] лучше подходят?
При наличии нескольких состояний вы должны помнить, что каждое состояние чрезвычайно изолировано от всех остальных.Единственный способ переместить значения из одного состояния в другое - использовать API C для извлечения значений из одного состояния и передачи их в другое.Сопрограммы дают некоторые преимущества отдельных состояний, в то же время разделяя общий набор глобалов.