Проверка значения элемента стека Lua из C ++ - PullRequest
1 голос
/ 19 февраля 2009

как проверить значение вершины стека в Lua?

У меня есть следующий код C ++:

if (luaL_loadfile(L, filename) == NULL) {
        return 0;// error..
    }

    lua_pcall(L,0,0,0); // execute the current script..

    lua_getglobal(L,"variable");

    if (!lua_isstring(L,-1)){ // fails this check..
        lua_pop(L,1);
        return 0; // error
}

Содержимое рассматриваемого файла

-- A comment
variable = "MyString"

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2009

Вероятная проблема заключается в том, что luaL_loadfile() задокументировано для возврата тех же значений, что и lua_load() или одного дополнительного кода ошибки. В любом случае возвращаемое значение - int, где 0 означает успех, а ненулевое значение - код ошибки.

Итак, тест luaL_loadfile(...) == NULL равен true , если файл был загружен, но код вызывает это как ошибку и возвращает.

Функция lua_pcall() также возвращает код состояния, и вы можете также проверить это.

В противном случае сценарий, как показано, действительно создает глобальную переменную, и lua_getglobal() будет извлекать ее в стек, где его можно протестировать с помощью lua_isstring(), или, возможно, с большей пользой позволит вернуть его значение, если оно достаточно строковое как с lua_tostring(). Последняя функция вернет либо const char *, указывающее на строку с нулевым символом в конце, либо NULL, если значение индекса стека не может быть преобразовано в строку. Обратитесь к справочному руководству по Lua со ссылками на остальные детали и предостережение об использовании lua_tostring() внутри цикла.

Редактировать: Я добавил лучшие ссылки на руководство в нескольких местах.

0 голосов
/ 19 февраля 2009

Я думаю, вы хотите заменить luaL_loadfile на lua_dofile . lua_pcall не нужен. Я предполагаю, что загрузка файла как функции с использованием luaL_loadfile, а затем запуск его с использованием pcall, возможно, не создаст глобальные переменные, которые вы хотите.

...