![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Lazin |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Часть вторая.
В предыдущей статье было показано, как передать данные интерпретатору lua, как загрузить и выполнить скрипт и как узнать результат его работы. Практической пользы в этом нет абсолютно никакой, но только до тех пор, пока мы не научимся управлять выполнением программы, через lua скрипт. Чтобы это стало возможным, нужно сделать так, чтобы скрипт мог вызвать функцию программы. Чтобы интерпретатор мог вызвать вашу функцию, программа, сперва, должна эту функцию зарегистрировать. lua_register(lua_State*, Имя функции, Адрес функции) Функция должна возвращать значение типа int и получать в качестве параметра указатель на lua_State:
Склеивающая функция должна следовать определенному протоколу для нормальной работы. В первую очередь она должна получить через lua_State количество переданных ей аргументов, это значение находится на вершине стека во время вызова.
Затем функция может обращаться к элементам в стеке ( lua_to...(lua_State*, index) [вместо многоточия следует поставить нужный тип, например bool string и тд] ), имеющим индексы i >= 1 i <= count. Эти элементы могут иметь разные типы, функция должна проверять перед использованием типы переданных ей аргументов (функциями lua_is...(lua_State*, index) ), так как интерпретатор lua в момент вызова функции из кода lua не выполняет таких проверок (он не проверяет даже количество переданных в функцию аргументов, не то что их тип ). Чтобы возвратить значение, функция должна поместить в стэк возвращаемые значения (функции lua_push...) и возвратить их количество. Функция может вернуть множество значений (это называется кортеж), причем для функции lua абсолютно естественно, возвращать переменное число параметров. Следующий пример иллюстрирует сказанное, программа регистрирует функцию print_arg, которая печатает количество переданных ей параметров, сами параметры и возвращает количество параметров. Скрипт использует эту функцию по назначению.
код скрипта:
Этот пример, уже намного более практичен. С помощю склеивающих функций вы можете изменять часть логики, не перекомпилируя проект, просто изменив скрипт. В следующей статье я покажу как реализовать в lua возможность, которая не поддерживается этим языком напрямую – объектно ориентированное программирование. |
||||||||
|
|||||||||
| Duplex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 16.7.2007 Где: Астрахань Репутация: нет Всего: нет |
А как можно вызвать функцию Lua с аргументами из C++?
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| Dronchik |
|
|||
![]() Звукач ёмаё ![]() ![]() Профиль Группа: Участник Сообщений: 451 Регистрация: 1.5.2007 Репутация: 0 Всего: 37 |
думаю статью можна перенести в раздел "Программирование игр, графики и исскуственного интелекта".
-------------------- Вместо слов делай дело, от которого ты фанатеешь. (с) |
|||
|
||||
| Duplex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 16.7.2007 Где: Астрахань Репутация: нет Всего: нет |
Спасибо...
|
|||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
Lazin,
Спасибо, хорошие статьи. --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |