Intereting Posts
Невозможно скопировать строку в массив строк в C Как указать размер enums в GCC? Назначение побитового ИЛИ целого числа с его отрицательным Как легко упаковать библиотеки, необходимые для анализа дампа ядра (например, packcore) Как контролировать выполнение родительского процесса после вызова execl () в программе C? Переполнение буфера в C Создание Makefile, который компилирует несколько файлов C для использования в Minix Программа, которая читает файл и отправляет его в родительский процесс с помощью канала Как читать сообщения от GSM-модема в Embedded C? Как найти длину / количество элементов для массива? PE File Parsing c / c ++ Как шифровать данные с помощью RSA, с SHA-256 в качестве хеш-функции и MGF1 в качестве функции генерации маски? Инициализация объектов макросами для целочисленных констант Как я могу копировать разрешения из файла, который уже существует? Профсоюзы ANSI C – действительно ли они полезны?

Хранить функцию Lua?

Вызов функции Lua из C довольно прямолинейный, но есть ли способ сохранить функцию Lua где-нибудь для последующего использования? Я хочу сохранить определенные пользователем функции Lua, переданные моей функции C для использования в событиях, подобно тому, как работает функция Connect в wxLua .

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

Основываясь на ответе Хавьера, Lua имеет специальную универсально доступную таблицу, называемую реестром, доступную через API C, используя псевдоиндекс LUA_REGISTRYINDEX . Вы можете использовать функцию luaL_ref для хранения любого значения Lua, которое вам нравится в реестре (включая функции Lua), и получить обратно целое число, которое можно использовать для ссылки на него с C:

 // Assumes that the function you want to store is on the top of stack L int function_index = luaL_ref(L, LUA_REGISTRYINDEX); 

Самый простой способ сделать это – использовать функцию «имя» и текст функции lua. Затем вы создаете таблицу в интерпретаторе (если она не существует), а затем сохраняйте функцию в таблице, используя именованный параметр.

В вашем приложении просто держите список имен функций, привязанных к каждому событию. Когда событие срабатывает, просто вызовите все функции из вашей таблицы, чей ключ соответствует именам в списке.